很久以前,我的项目中有一个文件,我现在希望能够获得它。

问题是:我不知道我什么时候删除了它,也不知道它是在哪条路径上删除的。

当该文件存在时,如何查找该文件的提交?


当前回答

假设您想恢复名为MyFile的文件,但不确定其路径(或扩展名):

初步:通过跨到git根来避免混淆

一个非平凡的项目可能有多个具有相似或相同文件名的目录。

> cd <project-root>

查找完整路径git-log--diff-filter=D--summary|grep delete |grep MyFile删除模式100644 full/path/to/MyFile.js

full/path/to/MyFile.js是您要查找的路径和文件。

确定影响该文件的所有提交git-log--oneline--follow--full/path/to/MyFile.jsbd8374c一些有用的提交消息ba8d20e影响该文件的另一个先前提交消息cfea812文件出现的提交的第一条消息。签出文件

如果您选择第一个列出的提交(最后一个按时间顺序排列,此处为bd8374c),则无法找到该文件,因为它在该提交中被删除。

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

只需选择前面的(附加插入符号)提交:

> git checkout bd8374c^ -- full/path/to/MyFile.js

其他回答

无法编辑接受的响应,因此将其添加为此处的答案,

要恢复git格式的文件,请使用以下命令(注意SHA后面的“^”符号)

git checkout <SHA>^ -- /path/to/file

我甚至不知道文件名是什么,所以我想看到所有被删除的文件。。。

总的来说,我强烈建议您熟悉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 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

假设您想恢复名为MyFile的文件,但不确定其路径(或扩展名):

初步:通过跨到git根来避免混淆

一个非平凡的项目可能有多个具有相似或相同文件名的目录。

> cd <project-root>

查找完整路径git-log--diff-filter=D--summary|grep delete |grep MyFile删除模式100644 full/path/to/MyFile.js

full/path/to/MyFile.js是您要查找的路径和文件。

确定影响该文件的所有提交git-log--oneline--follow--full/path/to/MyFile.jsbd8374c一些有用的提交消息ba8d20e影响该文件的另一个先前提交消息cfea812文件出现的提交的第一条消息。签出文件

如果您选择第一个列出的提交(最后一个按时间顺序排列,此处为bd8374c),则无法找到该文件,因为它在该提交中被删除。

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

只需选择前面的(附加插入符号)提交:

> git checkout bd8374c^ -- full/path/to/MyFile.js

下面是一个简单的命令,在这里,开发人员或git用户可以从存储库根目录传递删除的文件名并获取历史记录:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

如果有人能改进指挥,请这样做。