【问题标题】:How to track the trace of a file through commits in the forward direction in a git repository?如何通过 git 存储库中的正向提交来跟踪文件的跟踪?
【发布时间】:2021-10-10 17:25:58
【问题描述】:

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

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

我想确定通过此类操作从原始文件“派生”的文件的最终列表(可以为空),最好使用 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-loggit-blame 得出解决方案,尽管我不知道完美的解决方案(不涉及瓷器)。

【问题讨论】:

  • 好吧,在 Git 中没有“前进”之类的东西。指针仅向后指向。
  • 您的意思是文件不能从父级到子级跟踪吗? @马特
  • 通常,无法可靠地判断文件是否已被复制、拆分或合并。在某些特殊情况下您可以,但这些是例外 - 不是规则
  • 是的,没有完美的方式可以肯定地说。但是对于我的情况来说,与 git-log 或 git-blame 一样可靠的用于复制、拆分、合并检测的解决方案就足够了。 @SpaceKatt

标签: git git-log git-rev-list


【解决方案1】:

简短的回答是 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 中的每个文件自动运行一次;这会很慢。)对此没有好的答案,至少今天没有。

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2017-03-15
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多