假设某个文件在某个时候在git回购协议中,但现在不存在,请查明该文件是否为';更名为';或';删除';或';重命名然后删除';
我想知道有关某个文件的详细信息,该文件在某个时候在git回购协议中,但现在不在回购协议中。这里有三种情况可供选择假设某个文件在某个时候在git回购协议中,但现在不存在,请查明该文件是否为';更名为';或';删除';或';重命名然后删除';,git,github,Git,Github,我想知道有关某个文件的详细信息,该文件在某个时候在git回购协议中,但现在不在回购协议中。这里有三种情况可供选择 文件已重命名。如果是,文件的当前名称是什么 文件已被删除。如果文件在删除之前的某个时间点未重命名,则应该直接执行此操作 文件被重命名,然后被删除 在所有这些情况下,如果重命名或删除文件,我想知道文件的当前名称 我在windows机器中使用powershell中的git,但这些步骤应该很容易在其他系统中复制 台阶 a。我添加了2个文件 Add-Content file1.txt "Th
Add-Content file1.txt "This is file 1"
Add-Content file2.txt "This is file 2"
git add .
git commit -m "Added file1.txt and file2.txt"
b。我重命名了file1.txt
git mv file1.txt fileone.txt
git commit -m "Renamed file1.txt to fileone.txt"
c。我删除了file2.txt
Remove-Item file2.txt
git add .
git commit -m “Deleted file file2.txt”
这些提交之间可能有更多的提交不会更改这2个文件。这是到目前为止我的git日志
git log –oneline
d618114 (HEAD -> master) deleted file2.txt
ba6ec22 Renamed file1.txt to fileone.txt
fe2a51e Added file1.txt and file2.txt
这就是我目前所拥有的
git log --name-status -- "file1.txt"
产出:
commit ba6ec22e3fdf7e6eb6f33acd83f49f99e9f2610a
Author: Sunil Shahi <myemail@email.com>
Date: Sun Oct 8 15:35:02 2017 -0500
Renamed file1.txt to fileone.txt
D file1.txt
commit fe2a51e9aa5835c5886b31f988e4076155c1194e
Author: Sunil Shahi <myemail@email.com>
Date: Sun Oct 8 15:31:27 2017 -0500
Added file1.txt and file2.txt
A file1.txt
输出
commit ba6ec22e3fdf7e6eb6f33acd83f49f99e9f2610a
Author: Sunil Shahi <myemail@email.com>
Date: Sun Oct 8 15:35:02 2017 -0500
Renamed file1.txt to fileone.txt
R100 file1.txt fileone.txt
commit fe2a51e9aa5835c5886b31f988e4076155c1194e
Author: Sunil Shahi <myemail@email.com>
Date: Sun Oct 8 15:31:27 2017 -0500
Added file1.txt and file2.txt
A file1.txt
提交ba6ec22e3fdf7e6eb6f33acd83f49f99e9f2610a
作者:Sunil Shahi
日期:2017年10月8日星期日15:35:02-0500
将file1.txt重命名为fileone.txt
R100 file1.txt fileone.txt
提交FE2A51E9AA5835886B31F988E407615C1194E
作者:Sunil Shahi
日期:2017年10月8日星期日15:31:27-0500
添加了file1.txt和file2.txt
一个file1.txt文件
这种方法对于已删除的文件就足够了。然而,如果它在被删除之前的某个时候被重命名,我将遇到同样的问题
提前感谢。这从根本上说是相当困难的;Git为此提供的工具实际上并不充分。虽然
git log--follow一次对一个文件运行得相当好,但它确实存在一个问题(如您所注意到的),即它以当前名称开始并向后运行。(这也是一个黑客:请参阅和。)
您可以使用git log--reverse
以及在每个父/子对之间运行git diff
的任何命令。例如,在git存储库上为git使用git log--raw
(运行git diff tree
,并启用重命名检测,尽管我不确定这是否是因为我默认启用了它,如果需要,可以添加-m
),我可以这样做:
$ git log --raw --since 02-20-2010 --until 02-28-2010 --reverse --oneline
2d3ca2167 t7006-pager: if stdout is not a terminal, make a new one
:100755 100755 4f52ea573... da0f96262... M t/t7006-pager.sh
:000000 100755 000000000... 73ff80937... A t/t7006/test-terminal.perl
9892bebaf sha1_file: don't malloc the whole compressed result when writing out objects
:100644 100644 657825e14... 9196b5783... M sha1_file.c
ea68b0ce9 hash-object: don't use mmap() for small files
:100644 100644 657825e14... 037515960... M sha1_file.c
e95a4df46 Merge branch 'mv/request-pull-modernize'
7fa2b1f60 Merge branch 'jn/makefile-script-lib'
92de34894 Merge branch 'jc/maint-fix-test-perm'
25666af37 Merge branch 'jc/checkout-detached'
5f8a0de98 Merge branch 'sp/push-sideband'
db3df36a3 Merge branch 'hm/maint-imap-send-crlf'
cab1b013e Merge branch 'tc/maint-transport-ls-remote-with-void'
241b9254e Merge branch 'ml/maint-grep-doc'
1caaf225f git-diff: add a test for git diff --quiet -w
:100755 100755 60dd2014d... 0391a5827... M t/t4017-diff-retval.sh
748af44c6 sha1_file: be paranoid when creating loose objects
:100644 100644 9196b5783... c0214d794... M sha1_file.c
8c33b4cf6 tests: Fix race condition in t7006-pager
:100755 100755 da0f96262... d9202d5af... M t/t7006-pager.sh
81b50f3ce Move 'builtin-*' into a 'builtin/' subdirectory
:100644 100644 afedb54b4... f1025d5c0... M Makefile
:100644 100644 2705f8d05... 2705f8d05... R100 builtin-add.c builtin/add.c
:100644 100644 fc43eed36... fc43eed36... R100 builtin-annotate.c builtin/annotate.c
:100644 100644 3af4ae0c2... 3af4ae0c2... R100 builtin-apply.c builtin/apply.c
:100644 100644 6a887f5a9... 6a887f5a9... R100 builtin-archive.c builtin/archive.c
:100644 100644 5b226399e... 5b226399e... R100 builtin-bisect--helper.c builtin/bisect--helper.c
:100644 100644 10f7eacf6... 10f7eacf6... R100 builtin-blame.c builtin/blame.c
:100644 100644 a28a13986... a28a13986... R100 builtin-branch.c builtin/branch.c
:100644 100644 2006cc5cd... 2006cc5cd... R100 builtin-bundle.c builtin/bundle.c
[massive snipping from here onward]
2010年2月底,Linus Torvalds将所有内置-*
源文件移到内置-*
中。上面的git日志
将显示的提交限制为该月最后一周左右的提交。使用--reverse
以及--raw
和重命名检测,我们发现我们可能记得的文件内置的add.c
变成了内置的/add.c
:相似性检测器发现它完全相同(R100
,100%相似),但名称已更改
请注意,您不能使用:
$ git log --follow --reverse builtin-add.c
fatal: ambiguous argument 'builtin-add.c': unknown revision or path not in the working tree.
因此,如果您不确定新名称是什么,则必须允许Git查看所有提交中的所有文件名,并搜索其diff生成的重命名记录,以查找重命名您确定的名称的提交
--raw
输出(对于我们七八年前使用git的人来说,这通常是通过git whatchanged
获得的)使得搜索'^:.*R.*您关心的文件名ttab'
;从那里,您可以获得文件的新名称。如果文件被多次重命名,您必须使用新名称重复此练习,以找到较新的新名称。感谢您提供了细致而深刻的答案。虽然我意识到这比我预期的要多一些,但这是一本有趣的书。我假设你最后一段中的正则表达式是为grep编写的。这意味着我需要修改它以适应windows中可用的其他工具。我认为选择字符串应该可以。如果你有一个WindowsGit,你就有一个shell和grep,因为有些Git脚本是用shell脚本编写的,并且使用像sed和grep这样的命令。但其他搜索者可能会更快或更方便,是的。
$ git log --follow --reverse builtin-add.c
fatal: ambiguous argument 'builtin-add.c': unknown revision or path not in the working tree.