我想了解一下git repo中某个文件的详细信息,但现在不在repo中。这里有三种情况可供选择。
在所有这些情况下,我有兴趣了解文件的当前名称(如果已重命名)或文件是否已删除。
我在使用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"
这种方法足以删除文件。但是,如果在删除之前的某个时刻重命名,我将遇到同样的问题。
提前致谢。
答案 0 :(得分:2)
这基本上很难; Git为此提供的工具并不足够。虽然git log --follow
一次可以很好地处理一个文件,但它确实存在问题(如您所述)它以当前名称开头并向后工作。 (这也是一个黑客:见`git log --follow --graph` skips commits和git 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
}
;从那里,你得到文件的新名称。如果多次重命名文件,则必须使用新名称重复练习,以查找较新的新名称。