鉴于某个文件在某个时刻存在于git repo但现在不存在,请查看文件是“重命名”还是“已删除”或“重命名然后删除”

时间:2017-10-08 21:25:06

标签: git github

我想了解一下git repo中某个文件的详细信息,但现在不在repo中。这里有三种情况可供选择。

  1. 文件已重命名。如果是,那么该文件的当前名称是什么。
  2. 文件已删除。如果文件在删除之前的某个时候没有重命名,那么这应该是直截了当的。
  3. 文件已重命名,然后被删除。
  4. 在所有这些情况下,我有兴趣了解文件的当前名称(如果已重命名)或文件是否已删除。

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

    STEPS

    一个。我添加了2个文件

    config_setting

    湾我重命名了file1.txt

    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"
    

    ℃。我删除了file2.txt

    git mv file1.txt fileone.txt
    git commit -m "Renamed file1.txt to fileone.txt"
    

    这些提交之间可能有更多提交不会更改这两个文件。到目前为止这是我的git日志

    Remove-Item file2.txt
    git add .
    git commit -m “Deleted file file2.txt”
    

    这是我到目前为止所拥有的。

    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 标志的当前文件名,我会得到更多详细信息,但我不知道文件名。

    --follow

    输出

    git log --follow --name-status -- "fileone.txt"
    

    这种方法足以删除文件。但是,如果在删除之前的某个时刻重命名,我将遇到同样的问题。

    提前致谢。

1 个答案:

答案 0 :(得分:2)

这基本上很难; Git为此提供的工具并不足够。虽然git log --follow一次可以很好地处理一个文件,但它确实存在问题(如您所述)它以当前名称开头并向后工作。 (这也是一个黑客:见`git log --follow --graph` skips commitsgit combining two files into one with history preserved。)

您可以做的是使用git log --reverse以及在每个父/子对之间运行git diff的任何命令。例如,使用git log --raw(在启用了重命名检测的情况下运行git diff-tree,但我不确定这是否是因为我默认启用它 - 如果需要,添加-M) Git的Git存储库,我可以这样做:

$ 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月下旬,在commit 81b50f3ce40bfdd66e5d967bf82be001039a9a98,Linus Torvalds将所有builtin-*源文件移至builtin/*。上述git log将提交的提交限制为该月最后一周左右的提交。将--reverse--raw一起使用并重命名检测,我们发现我们可能记得builtin-add.c的文件变为builtin/add.c:相似性检测器发现它完全是R100相同($ git log --follow --reverse builtin-add.c fatal: ambiguous argument 'builtin-add.c': unknown revision or path not in the working tree. ,100%相似),但名称已更改。

请注意,您无法使用:

--raw

所以,如果您不确定新名称是什么,您必须允许Git查看所有提交中的所有文件名,并搜索其差异生成的重命名记录以查找重命名您名称

git-whatchanged输出(曾经使用'^:.*R.*file-name-you-care-aboutTAB'获得,对于我们这些在七年或八年前使用过Git的人来说)可以相对轻松地搜索{('Live', '2017-Jan', '103400000', 'Amount'): 30, ('Live', '2017-Feb', '103400000', 'Amount'): 31, ('Live', '2017-Mar', '103400000', 'Amount'): 32, ('Live', '2017-Jan', '103401000', 'Amount'): 34 } ;从那里,你得到文件的新名称。如果多次重命名文件,则必须使用新名称重复练习,以查找较新的新名称。