0

假设我们在某个提交C中有一个文件F。给定未来的提交C',推断C'中从F派生的文件列表的最佳方法是什么?

一个文件可以在从一个提交到另一个提交的过程中以任意顺序多次修改、重命名、移动、复制、删除、拆分和合并。

我想确定通过此类操作从原始文件“派生”的文件的最终列表(可以是空的),最好使用 git 的管道命令。

是的,没有办法可靠地确定文件是否被拆分、合并、移动或复制。但是在 git-log 或 git-blame 中用于相同目的的算法应该没问题。(感谢@SpaceKatt)。

TL;DR我想要一个在给定输入的情况下产生以下输出的函数:

Input: {F, C, C'}
  C is an earlier commit.
  C' is a later commit (and C is reachable from C')
  F is a file in C

Output: {F1', F2', F3', ...}
  Fx's are list of files in C' that are derived from F

注意:如果这是相反的问题(即查找文件的历史记录),则可以使用git-logor得出解决方案git-blame,尽管我也不知道对此有完美的解决方案(不涉及瓷器)。

4

1 回答 1

1

简短的回答是 Git 只能后退,而不能前进(如matt 所述)。

解决方法很简单:倒退。假设您有一个标识最终提交的分支名称BR

... <-F <-G <-H ... <-Z   <--BR

并且您希望“从 G 前进”。首先从以下开始向后列出每个提交Z

git rev-list BR

当你到达 commitG时,停止。获取刚刚生成的哈希 ID 列表,现在您可以一次处理一对:

(H, G)
(I, H)
(...)
(Z, Y)

请注意,它git blame --reverse已经“知道如何做到这一点”,但仍然需要两个端点,即您必须定位Z,假设您想前进到Z. 但是您必须自己选择文件名,这是一个问题。(您可以为 中的每个文件自动运行一次Z;这会很慢。)对此没有好的答案,至少今天没有。

于 2021-08-05T18:20:05.040 回答