如何通过Git命令行获取特定提交版本的文件URL及本地仓库对应文件
当然可以实现你的需求,我分两部分给你详细说明:
一、获取特定提交版本的文件
既然已经把仓库拉到本地,要拿到某个提交下的特定版本文件,有两种实用方式:
直接查看文件内容:用
git show命令就能直接在终端输出目标版本的文件内容,格式是git show <提交哈希>:<文件路径>。比如你例子里的提交e7013f5e154404526cd5b920104b77e19ae7dc65和文件src/test/regress/sql/alter_table.sql,对应的命令就是:git show e7013f5e154404526cd5b920104b77e19ae7dc65:src/test/regress/sql/alter_table.sql导出文件到本地:如果想把这个版本的文件保存下来,只要把
git show的输出重定向到新文件即可:git show e7013f5e154404526cd5b920104b77e19ae7dc65:src/test/regress/sql/alter_table.sql > alter_table_specific_version.sql执行后,当前目录就会生成该版本的文件副本。
二、生成对应Gitweb的文件URL
Git本身没有内置命令直接生成PostgreSQL Gitweb风格的URL,但可以通过手动拼接或者自定义Git别名来高效实现:
1. 手动拼接方式
先执行git remote get-url origin获取仓库的远程地址,比如PostgreSQL的远程地址是https://git.postgresql.org/git/postgresql.git。
然后按照Gitweb的固定URL结构拼接:https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=<文件路径>;h=<文件对应的提交哈希>;hb=<分支/父提交哈希>
把你需要的参数填进去,就能得到和例子里一样的URL。
2. 自定义Git别名(更省心)
可以给Git配置一个自定义别名,自动帮你完成URL拼接。执行以下命令设置别名:
git config --global alias.gitweb-blob '!f() { REMOTE_URL=$(git remote get-url origin | sed -e "s/git@/https:\/\//" -e "s/:/\//" -e "s/\.git$//"); REPO_NAME=$(basename "$REMOTE_URL"); echo "https://git.postgresql.org/gitweb/?p=$REPO_NAME.git;a=blob;f=$1;h=$2"; }; f'
之后要生成某个文件的Gitweb URL时,只要运行:
git gitweb-blob src/test/regress/sql/alter_table.sql e7013f5e154404526cd5b920104b77e19ae7dc65
终端会直接输出完整的URL,复制就能使用啦。
注意:这个别名是针对PostgreSQL的Gitweb格式编写的,如果是其他Gitweb服务(比如GitHub、GitLab),URL结构不同,需要调整别名里的拼接规则。
内容的提问来源于stack exchange,提问作者jian

