【问题标题】:git How to list all file and directory renames between two commitsgit如何列出两次提交之间的所有文件和目录重命名
【发布时间】:2020-08-19 13:46:58
【问题描述】:

我正在编写一个使用 git 的脚本。它需要知道所有重命名的目录和文件的旧文件路径和新文件路径。

我想做的例子:git diff --find-renames-only someGitHash someGitHash 然后我想看到一个类似的列表:

rename old/path/old-file-name.extension->new/path/new-file-name.extension

rename from source/README.md
rename to documentation/README.md

或者类似的东西,只要它有旧文件名和旧目录路径,新文件名和新目录路径。

到目前为止,我到处乱找,最接近的是git diff --find-renames

git diff --find-renames 给了我我想要的数据,但是每个文件的数据太多了。这绝对不是我想要处理和解析的东西。我正在使用的一些 git 存储库可能有数千个文件/文件夹重命名......

例子:

...tons more data that I do not want to parse through
rename from source/README.md
rename to documentation/README.md
...tons more data including diffs of files before and after... 

this pattern continued for each file...

如何在没有额外数据的情况下列出两次 git 提交之间的所有文件和目录重命名?

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 如果git diff <comit1> <commit2> 产生了你想要的,但是太多了,把它剪掉:git diff --name-status <commit1> <commit2>;添加--diff-filter=R 以仅显示R-status 结果。

标签: git rename diff file-rename git-diff


【解决方案1】:
git log --name-status <start_commit>..<end_commit> | grep ^R

这将显示从最新到最旧的重命名历史。

输出如下:

R100    the-5-min/.watchmanconfig       the-10-min/.watchmanconfig
R100    the-5-min/App.tsx       the-10-min/App.tsx
R085    the-5-min/app.json      the-10-min/app.json
R100    the-5-min/assets/examples/accordion.png the-10-min/assets/examples/accordion.png
R100    the-5-min/assets/examples/angular-gradient.png  the-10-min/assets/examples/angular-gradient.png

第一个字母是变更类型(不同变更类型详见--diff-filter),数字是提交之间的相似程度。列出的第一个文件名是旧文件名,第二个文件名是新文件名。

【讨论】:

  • 这太好了,谢谢!有没有办法只看到两次提交之间的变化?
  • 编辑了我的答案以解决您的问题。
  • 你知道一种方法可以做到这一点,但只针对重命名的目录吗?
  • 不幸的是我没有。困难的是目录本身没有被检入 git,即使其中的文件被检入。我解决这个问题的方法是使用xargscut 来测试路径中的每个组件是否是目录,但这只会测试对当前存在的目录的更改。另一种方法可能是使用find 遍历 git 路径中的目录并检查它们的 git 历史记录。祝你好运。
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2014-01-07
  • 2023-03-15
相关资源
最近更新 更多