如何记录使用旧路径重命名/移动的文件的整个git历史记录?

如何记录使用旧路径重命名/移动的文件的整个git历史记录?,git,version-control,Git,Version Control,如果文件a被编辑一次或多次,然后重命名/移动到B并作为B编辑一次或多次,则使用其新名称/路径发出以下git命令 git log --follow -- B 。。。展示了它的整个历史 但是,当我查看同一项目的一个旧的(已发布/维护的)分支时,其中的文件仍然命名为A,我想在master中对其进行后台更改,我可能会认为在master上发布以下命令 git log --follow -- A 。。。将显示所有更改。但事实并非如此。日志中显示的最新提交是与从A重命名为B对应的更改。未显示对B所做的更改

如果文件
a
被编辑一次或多次,然后重命名/移动到
B
并作为
B
编辑一次或多次,则使用其新名称/路径发出以下git命令

git log --follow -- B
。。。展示了它的整个历史

但是,当我查看同一项目的一个旧的(已发布/维护的)分支时,其中的文件仍然命名为
A
,我想在
master
中对其进行后台更改,我可能会认为在
master
上发布以下命令

git log --follow -- A
。。。将显示所有更改。但事实并非如此。日志中显示的最新提交是与从
A
重命名为
B
对应的更改。未显示对
B
所做的更改

i、 e.
--follow
仅在从较新名称“向后”重命名为较旧名称之后,而不在“向前”重命名之后

此时,我必须首先确定显示的最新提交是一个重命名,找到较新的名称,并发出一个
git日志——再次使用新名称跟踪
(如果自维护版本以来文件被移动了几次,可能会重复几次)


我怎样才能找到整个历史记录而不必手动发出
git log——跟踪几次

不幸的是,
git log
本身严格地向后工作,就像git总是这样。git实际上无法向前工作,因为git存储的是向后的:每个提交都会记住其父提交的哈希ID,但是由于所有提交在创建时都被冻结,因此它们无法记住其子代的哈希ID,这些子代将在稍后创建

什么
git日志
(及其类似于大姐/主力的管道命令
git版本列表
)我们可以做的就是做一次反向遍历,找出哪些提交在其他提交之前,然后反向打印。
git log--reverse
命令可以做到这一点。但是遗憾的是,重命名检测只发生在向后(对git来说是向前的)遍历过程中,不能插入到后面的向前(对git来说是向后的)遍历中打印输出

它不是Git内置的,但您可以使用
Git rev list
进行反转,保存结果,然后在每个提交对上运行
Git diff--name status
时进行自己的向前行走,寻找重命名操作。请注意,这仍然有点棘手,因为现在分支实际上是分支,合并实际上是在Git的中合并三次向后遍历,合并分支,同时合并分支。:-)也就是说,假设我们有:

  tag:abc
     |
     v
...--o--o--*--o--o--o   <-- tip1
         \
          o--*--o----o   <-- tip2

现在,从
abc
tip1
的路径包括两个重命名。如果从
tip1
开始,则必须给出
git log——遵循执行合并的人选择保留的姓名,无论是
B
还是
C
。由于
git log--B
git log--C
(以正确的名称为准)对历史进行简化,git将只走在
M
后面的两条腿中的一条腿,即最上面一行或最下面一行,根据哪个分支具有匹配的文件,并且当您从
abc
向前工作时,您必须从两个分支中选择一个进行工作,或者做一些有趣的事情,以便您知道检查
A
-沿顶部变为-
B
,同时检查
A
-沿底部变为-
C
。(Git不会做任何花哨的事情。)

你不能总是跟踪每一个移动/重命名操作,因为有时候Git搞不清楚。这不是一个答案,但最好的办法是避免在Git中移动/重命名文件,如果你能管理的话。我不认为这是一个很好的解决方案,因为Git并没有像你描述的那样在历史上真正向前发展,但我可以为
Git log
(和其他)推荐标志
--name status
它显示了每次提交时对每个文件所做的更改(例如,
M
=修改,
R
=重命名)。@JanKrüger,很好!没有pathspec的
git日志--oneline--name状态
非常适合搜索和查找重命名。
  tag:abc
     |
     v
...--o--o--*--o--o--o--M--o   <-- tip1
         \            /
          o--*--o----o   <-- tip2