我想找到修改源文件的最新提交.
我可以git blame用来查看每行提交的所有日期,但是很难确切地知道哪个提交是最后一个提交文件.
如何在git存储库中找到触及给定文件的最后一次提交?
Jo *_*iss 201
git log 支持查看特定文件(和目录)的历史记录,因此您可以这样调用它:
git log my/file.c
Run Code Online (Sandbox Code Playgroud)
如果你真的只想列出了一个最新的承诺,例如在脚本中使用它,你可以使用-n 1:
git log -n 1 --pretty=format:%H -- my/file.c
Run Code Online (Sandbox Code Playgroud)
--pretty=format:%h告诉git log我只显示提交哈希值(感谢TheBamf).在--分体从得到解释为提交的名称停止文件名,以防万一它是不明确的.
Mic*_*son 41
如果您只是想查找最近的提交,那么您不希望git-log,您希望git-rev-list在该提交路径中列出更改该文件的提交对象,从最新的提交开始(按时间顺序排列).简单的说:
git rev-list -1 <commit> <filename>
对于git-rev-list您的情况,您只需提供:
这只返回当前分支中最新的提交ID以更改该文件,例如: 215095e2e338525be0baeeebdf66bfbb304e7270
对于更复杂的示例,您可以使用标记名称,甚至远程引用,并包含带通配符的相对路径名,例如:
git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt
...哪个会告诉你最近的变化是对该分支历史中的通配符匹配的影响.rev-list的选项是极端的,它是最重要的管道命令之一,因此您可以包含或排除您可以想象的任何标准.
当然,请参阅git-rev-list(1)手册页.
The*_*amf 27
如果你想获得最新提交的哈希来修改一组特定的文件(并且想要避免awk),你可以使用:
git log -n 1 --pretty=format:%h -- <path>
Run Code Online (Sandbox Code Playgroud)
这对于获取随后使用的提交哈希非常有用git describe.
例如(如果它对任何人都有用)......
我通过考虑最新提交更改任何源文件来创建当前版本ID(假设您标记带有标签的版本mycode-1.2.1):
COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
continue
else
VN="mycode-unknown"
fi
Run Code Online (Sandbox Code Playgroud)
这会产生如下的ID:
mycode-1.2.1 - 当源文件的当前状态对应于标记版本时mycode-1.2.1-g3k7s2 - 当源文件的当前状态对应于标记版本之后的提交时mycode-1.2.1-g3k7s2-mod - 自标记版本之后的上次提交以来修改了源文件的当前状态mycode-unknown - 尚未创建版本标记时Nou*_*him 10
我不确定这是否是你想要的,但如果你做了一个git log <thefile>获取改变该文件的提交.你可以挑选最顶层的.它应该是你正在寻找的那个.