假设我们在某个提交C中有一个文件F,给定未来的提交C',从F导出C‘中的文件列表的最佳方法是什么?
在文件从一个提交到另一个提交的过程中,可以按任意顺序修改、重命名、移动、复制、删除、拆分和合并文件。
我想确定通过这样的操作从原始文件中“派生”的文件的最终列表(可以是空的),最好使用git的管道命令。
是的,没有办法可靠地说一个文件是否被分割、合并、移动或复制。但是,在git日志或git-指责中用于相同目的的算法应该是可以的。(谢谢@SpaceKatt)。
TL;DR I需要一个函数,在输入的情况下产生以下输出:
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-log或git-blame导出一个解决方案,尽管我也不知道有一个完美的解决方案(不涉及瓷器)。
发布于 2021-08-05 18:20:05
简单地说,Git只能向后走,而不能向前走(如matt noted)。
解决这个问题的方法很简单:向后走。假设您有一个分支名BR,它标识了一些最终提交:
... <-F <-G <-H ... <-Z <--BR你希望“从G中前进”。首先,从Z开始,列出每一次向后提交:
git rev-list BR当您到达提交G时,停止。拿出您刚刚生成的散列ID列表,现在您可以一次只对处理它们:
(H, G)
(I, H)
(...)
(Z, Y)请注意,git blame --reverse已经“知道如何做到这一点”,但它仍然需要两个端点,也就是说,假设您想要前进到Z,就必须定位Z。但是您必须自己选择文件名,这就是问题所在。(您可以自动地对Z中的每个文件运行一次;这会很慢。)这一点没有很好的答案,至少今天没有。
https://stackoverflow.com/questions/68671049
复制相似问题