很久以前,我的项目中有一个文件,我现在希望能够获得它。
问题是:我不知道我什么时候删除了它,也不知道它是在哪条路径上删除的。
当该文件存在时,如何查找该文件的提交?
很久以前,我的项目中有一个文件,我现在希望能够获得它。
问题是:我不知道我什么时候删除了它,也不知道它是在哪条路径上删除的。
当该文件存在时,如何查找该文件的提交?
当前回答
@琥珀给出了正确的答案!另外,如果您不知道文件的确切路径,可以使用通配符!这对我有用。
git log --all -- **/thefile.*
其他回答
我甚至不知道文件名是什么,所以我想看到所有被删除的文件。。。
总的来说,我强烈建议您熟悉gitfilter repo。它有许多用于重写历史记录的用途,但它的一个分析功能包括非常快速地识别回购中所有删除的文件,并显示其大小和删除日期。(在非Windows操作系统上使用它非常简单,这里是专门针对Windows的安装说明。)
一旦它在您的路径中运行,您只需运行:
git filter-repo --analyze
这将在.git文件夹中输出一些文件,您要查看的文件名为:
.git\filter-repo\analysis\path-deleted-sizes.txt
此文件显示回购中所有已删除的文件,按大小和删除日期进行反向排序。下面是一个示例输出:
=== Deleted paths by reverse accumulated size ===
Format: unpacked size, packed size, date deleted, path name(s)
57151421 44898377 2022-07-22 somdirectory/somefileA
46034619 42929136 2022-01-18 somdirectory/somefileB
65332368 29102439 2020-09-28 somdirectory/somefileC
23686432 21681498 2022-07-22 somdirectory/somefileD
23681272 21678818 2022-07-22 somdirectory/somefileE
23676153 21670502 2022-07-22 somdirectory/somefileF
43232768 21439037 2020-07-10 somdirectory/somefileG
18714315 14299243 2019-01-10 somdirectory/somefileH
16788104 13035176 2019-01-10 somdirectory/somefileI
显然,您可以使用它来查找您要查找的文件,或者,在重写历史记录的上下文中,根据第二列的大小,我知道如果我从历史记录中删除这9个已删除的文件,我将回收大约220MB。
一旦您确定了要查找的文件,就可以使用它来查找提交:
git log --all --full-history -- <filename>
下面是一个简单的命令,在这里,开发人员或git用户可以从存储库根目录传递删除的文件名并获取历史记录:
git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all --
如果有人能改进指挥,请这样做。
摘要:
步骤1
在已删除文件的历史记录中搜索文件的完整路径git-log--diff-filter=D--summary|grep filename
步骤2
您在删除文件之前从提交还原文件
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
如果您希望查看所有已删除文件的大小
以及相关的SHA
git log --all --stat --diff-filter=D --oneline
添加-p |--补丁以查看内容
git log --all --stat --diff-filter=D -p
要缩小到任何文件,您有两个简单的选项,可以使用路径规范,也可以通过管道连接到grep并搜索文件名。
使用grep:
git log --all --stat --diff-filter=D --oneline | grep foo
使用路径规范:
git log --all --stat --diff-filter=D --oneline -- '*foo*'
如果您想查看内容,路径规范可以与-p |--patch配合使用:
git log --all --stat --diff-filter=D --oneline --patch -- '*foo*'
如果你知道文件在哪里,你可能也会喜欢这个
git log --all --full-history -- someFileName
获取删除文件的列表并复制删除文件的完整路径
git log --diff-filter=D --summary | grep delete
执行下一个命令以查找该提交的提交id并复制该提交id
git log --all -- FILEPATH
显示已删除文件的差异
git show COMMIT_ID -- FILE_PATH
记住,您可以使用>like将输出写入文件
git show COMMIT_ID -- FILE_PATH > deleted.diff