按日期顺序获取所有提交记录的列表(包括悬挂提交记录)

3
如何获取一个按日期排序的所有可达内容列表?包括普通提交、暂存区、删除的暂存区、从已删除分支中提交的记录 - 以及尚未清理的所有内容。
我问这个问题是因为我需要找到一个特定的提交(或暂存区),但我记得的只有它添加的日期。由于我从未运行过git gc,所以我假设它应该仍然可以在某个地方找到。
我还需要查看每个提交的时间戳,因为我将不得不使用它来缩小搜索范围,只查找我想要的日期周围的提交/暂存区。
编辑:如果不清楚,搜索悬挂提交和删除的暂存区非常重要,除了正常的提交和暂存区之外。像如何基于作者的时间戳使git log排序?这样的问题不能解决这个问题。

这里的真正问题是git-fsck是用来查找悬空提交的工具,但它不会按日期排序。你只能得到一个或多个悬空提交的SHA值。 - undefined
@Makoto 嗯,如果我能在日志中获取日期,至少我可以使用正则表达式进行搜索。我可以尝试查找那个月的日志。我更喜欢按日期排序,但即使得到无序的日志也可以作为一个开始。 - undefined
2个回答

3

有一个尝试的方法就是简单地运行git refloggit reflog HEAD(这两个命令等效,第一个只是第二个的简写)。

reflog会记录特定ref所指向的每个提交;HEAD是指向当前检出内容的ref,因此如果您曾经在本机上检出过相关提交,并且它还没有被垃圾收集,它应该会在列表中显示出来。


谢谢你的回答,但是git reflog没有显示时间戳,而我需要这些来找到我的提交。我将会在特定日期附近寻找提交记录。 - undefined
2
@sashoalm 你可以将任何 git log 的格式应用到 git reflog 上,所以你可以使用 git reflog --pretty=fuller 或者其他包含你想要的信息的自定义格式。在阅读了你的澄清之后,我意识到这种方法无法覆盖已删除的暂存区内容;暂存区是一些从未提交过的内容,因此不会出现在 HEAD 的 reflog 中,实际上它们被存储为一个特殊的 reflog,当它们被删除时,会从该特殊的 reflog 中移除。 - undefined
被丢弃的存储区是否会立即被清空?我的意思是,它们是否会被保存在某个地方,还是在被丢弃后从git中彻底删除? - undefined
1
我看到在https://dev59.com/NXVD5IYBdhLWcg3wGXlI中提到使用`git fsck --no-reflog | awk '/dangling commit/ {print $3}'`,我可以尝试这样做。 - undefined
2
@sashoalm 各种命令运行 git gc --auto,它会自动重新打包提交,如果有太多的松散对象或太多的包文件,并且会自动修剪早于给定日期的松散对象(默认为2周)。所以,如果您的提交超过两周,并且实际上没有被任何地方引用,它们很可能已经被修剪掉了。如果它们仍然在 reflog 中被引用,或者年龄不到两周,则您可以通过查看 reflogs 或使用您提到的方法,即使用 git fsck 来找到它们。 - undefined
好的,我会接受你的答案,尽管现在最有用的部分在评论中 :) - undefined

2
悬挂提交的内容:
% git fsck --lost-found | awk '/^dangling commit/ {print $3}' \
| xargs -l1 sh -c $'time=$(git cat-file -p "$1" | awk \'/^committer/ {printf "%s", $(NF-1); exit}\'); printf "%s %s\n" "$1" "$(date -d@"$time" -Is)" ' _ \
| sort -rk2

输出:

c3c00af52dd3efcaaa76ac8a84e008ac0bd5db9e 2023-08-15T22:39:17+07:00
e77099f9ad2c5b1ccd3eb910848b0f35d598d00a 2023-08-15T22:38:50+07:00
983a95b7a12d38bdc2246006bb1e0face1ab6441 2023-08-14T13:53:56+07:00

要获取包括通过 reflog 可达的提交的超集,请将第一行替换为:

git fsck --unreachable | awk '/commit/ {print $3}' \

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接