假设某个文件在某个时候在git回购协议中,但现在不存在,请查明该文件是否为';更名为';或';删除';或';重命名然后删除';

假设某个文件在某个时候在git回购协议中,但现在不存在,请查明该文件是否为';更名为';或';删除';或';重命名然后删除';,git,github,Git,Github,我想知道有关某个文件的详细信息,该文件在某个时候在git回购协议中,但现在不在回购协议中。这里有三种情况可供选择 文件已重命名。如果是,文件的当前名称是什么 文件已被删除。如果文件在删除之前的某个时间点未重命名,则应该直接执行此操作 文件被重命名,然后被删除 在所有这些情况下,如果重命名或删除文件,我想知道文件的当前名称 我在windows机器中使用powershell中的git,但这些步骤应该很容易在其他系统中复制 台阶 a。我添加了2个文件 Add-Content file1.txt "Th

我想知道有关某个文件的详细信息,该文件在某个时候在git回购协议中,但现在不在回购协议中。这里有三种情况可供选择

  • 文件已重命名。如果是,文件的当前名称是什么
  • 文件已被删除。如果文件在删除之前的某个时间点未重命名,则应该直接执行此操作
  • 文件被重命名,然后被删除 在所有这些情况下,如果重命名或删除文件,我想知道文件的当前名称

    我在windows机器中使用powershell中的git,但这些步骤应该很容易在其他系统中复制

    台阶

    a。我添加了2个文件

    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.