在两次 git 提交之间生成所有要删除的文件和所有要添加的文件的列表

Produce list of all files to delete and all to add between two git commits

我有一个必须处理的旧系统,而且界面很垃圾。我无法重命名或移动文件。我必须删除旧位置并添加新位置。

我通过提供要删除的所有文件的列表,然后提供要添加/更新的所有文件的列表来做到这一点

当我重命名文件并在 git 中提交它时,它算作一个 rename 操作,所以当我 运行

git diff SHA1 SHA2 --name-only

我得到了所有删除、添加和重命名的列表。如果我运行

git diff SHA1 SHA2 --name-only --diff-filter=R

我得到了操作的最终结果(文件重命名为 但不是重命名为 from 的内容)。如果我运行

我删除了文件,但没有重命名为 的文件。

不需要在单个命令中使用它,我可以产生重叠并稍后对输出进行重复数据删除。

帮忙?谢谢

在git中没有重命名操作。当 diff 报告重命名时,它在一个路径上看到一个删除,在另一个路径上看到一个添加,计算出新文件是 "similar enough" 到被删除的文件,它可能只是一个重命名,并推断你希望这样报道。

如果您不想将它们报告为重命名,而是希望分别报告删除和添加,那么您可以说

git diff SHA1 SHA2 --name-only --no-renames

更有用的是,你可以说

git diff SHA1 SHA2 --name-status --no-renames

并且删除文件的行将以 D 开头,添加文件的行将以 A.

开头

另一方面,如果您正在使用 --name-status,那么根据您对输出所做的操作,也许不关闭重命名检测就可以了;然后你会得到类似

的东西
$ git diff SHA1 SHA2 --name-status

R100   file1   file2

其中 IIRC R100 表示 "renamed with 100% content match"

但话又说回来,如果将条目放在不同的行上对您来说效果很好,那么关闭重命名检测可能会更有效(尤其是在实际发生许多删除和添加的情况下)。

我想最后一个排列:如果你真的只想要文件名列表,那么你可以制作一个添加列表

git diff SHA1 SHA2 --name-only --no-renames --diff-filter=A

和删除之一

git diff SHA1 SHA2 --name-only --no-renames --diff-filter=D