无需检出提交,获取指定文件在任意提交点的最新提交哈希
获取指定提交点附近文件的最新提交哈希(无需checkout)
问题说明
需要在不执行git checkout的情况下,获取指定文件在某个提交点附近的最新提交哈希。例如,针对提交93b19868e6,要找到doc.md对应的目标提交哈希为2826596092。提交历史如下:
24bfbe13a8 * main.c: Add base36. 7988ca6a48 * main.c: Fix build. 50a72a08af * main.c: Update to 6.6.3. 91ad8a1444 * build.mk: Use IMPORT_PATH2. 2ce05b362c * doc.md: Move "Section 2.4" after "Section 5.1". given this ->93b19868e6 * main.c: Add base32. want this ->2826596092 * doc.md: Fix menus. 726e7e3996 * main.c: Enable tests. 7878cd0659 * main.c: Fix build. 227e0469db * doc.md: Simplify installation instructions 93ccf08b4a * main.c: Deprecate use of curl.
当前做法是先执行git checkout 93b19868e6,再执行git log -n 1 -- doc.md,但希望在脚本中完成且不改变当前目录状态。
解决方案
情况1:获取指定提交点及之前的最新文件提交
如果需要找到指定提交点或更早的最新doc.md提交,直接用git log指定提交点作为起点即可:
git log -n 1 --pretty=format:"%H" 93b19868e6 -- doc.md
这条命令会返回2ce05b362c,完全不会修改当前工作目录状态。
情况2:获取指定提交点之后的首个文件提交
如果要找指定提交点之后第一个修改doc.md的提交(即示例中的2826596092),可以使用:
git log --reverse 93b19868e6..HEAD -- doc.md | head -n 1 | awk '{print $1}'
命令解释:
93b19868e6..HEAD:限定查找范围为指定提交之后到当前HEAD的所有提交--reverse:将提交顺序反转,从旧到新排列head -n1:取第一个结果(即指定提交后首个修改文件的提交)awk '{print $1}':提取提交哈希值
情况3:获取距离指定提交点最近的文件提交
如果要找距离指定提交点最近(无论前后)的doc.md提交,需要分别查找前后的提交并比较距离:
# 获取指定提交之前的最新文件提交 prev_commit=$(git log -n 1 --pretty=format:"%H" 93b19868e6 -- doc.md) # 获取指定提交之后的首个文件提交 next_commit=$(git log --reverse 93b19868e6..HEAD -- doc.md | head -n1 | awk '{print $1}') # 计算两个提交与指定提交的距离 prev_distance=$(git rev-list --count $prev_commit..93b19868e6) next_distance=$(git rev-list --count 93b19868e6..$next_commit) # 输出距离更近的提交 if [ $prev_distance -le $next_distance ]; then echo $prev_commit else echo $next_commit fi
在你的示例中,这条脚本会返回2826596092,因为它距离93b19868e6仅1个提交,而之前的2ce05b362c距离为5个提交。
内容的提问来源于stack exchange,提问作者Lorem Ipsum
相关产品推荐
相关产品推荐

