Git show:在文本选择的修订中显示blob

qvtsj1bj  于 12个月前  发布在  Git
关注(0)|答案(2)|浏览(115)

我知道你可以使用gitreviews(1)中的:/<text>-语法来选择一个版本号,例如:

git show :/"new change"

字符串
将在提交消息中显示(最年轻的可达)带有“新更改”的提交。
我也经常使用这个特性来git show特定版本中的blob,例如。

git show myBranch:./coolFile.csv


查看coolFile.csv的全部内容(在我的相对路径中)* 在修订版 * myBranch的状态下。
现在我的问题是:我可以使用:/<text>语法选择一个修订版本,然后在该修订版本中显示一个blob吗?

git show (:/"new change"):./coolFile.csv
git show :/"new change":./coolFile.csv


抛出了错误
fatal:ambiguous argument ':/new change:./coolFile. csv':未知的修订版本或路径不在工作树中。
使用'--'将路径与修订分开,如下所示:
'git [...] -- [...]'
所以我试

git show :/"new change" -- ./coolFile.csv


它什么也不打印,因为该语法只打印该文件中该版本的更改。

2admgd59

2admgd591#

你可以使用command substitution

git show $(git rev-list -1 :/"new change"):coolFile.csv

字符串
(Here git rev-list仅输出所需的修订散列)

  • 注意**(感谢@phd):这是一个bash机制,在windows cmd中不起作用。*
y0u0uwnf

y0u0uwnf2#

命令替换(如Romain Valeri's answer)或其他一些两步过程通常是要走的路。但是,请注意,这里的问题是语法::/regex没有办法 * 终止 * 正则表达式并恢复修订说明符。如果我们看看the gitrevisions documentation,我们发现这个:/regex:/<text>语法:
.命名提交消息与指定正则表达式匹配的提交。此名称返回可从**any ref(包括HEAD)**访问的最年轻的匹配提交
(黑体字我的)。
:/<text>的上述描述中,我们发现:
^{/<text>}, e.g. HEAD^{/fix nasty bug}
是这样描述的:
.与下面的:/fix nasty bug语法相同,只是它返回可从^之前的<rev>访问的最年轻的匹配提交。

  • 这个 * 语法 * 确实 * 有一个“右括号”的等价物,也就是右括号。所以如果你愿意只从HEAD或其他单个ref中搜索,而不是从 every ref中搜索,你可以用HEAD^{/foo}代替:/foo,这个 * 可以 * 后面跟着:./coolFile.csv
git show HEAD^{/new\ change}:./coolFile.csv

字符串
一些revspec参数不能被附加到的事实在一些shell脚本Git命令中被忽略了一段时间,人们做了这样的事情:

set -e     # if/as appropriate
cmt=$(git rev-parse "$1"^{commit})
tree=$(git rev-parse "$1"^{tree})
... go on to use $cmt as the commit and $tree as the tree ...


而实际上我们必须做的是:

t=$(git rev-parse "$1")
cmt=$(git rev-parse $t^{commit})
tree=$(git rev-parse $t^{tree})


例如在$1读取:/fix nasty bug的情况下。

相关问题