git 在提交之间Map行号

t9aqgxwy  于 2023-01-24  发布在  Git
关注(0)|答案(1)|浏览(136)

假设我在git repo中有一个文件,其中包含一行在commit a中引入的代码(我可以用git blame看到),假设这一行是文件中的第5行,那么commit a延迟了一段时间,所以文件中的其他内容也在同时发生了变化,特别是在这一行上面的一行被删除了;因此,在提交a时,我的行是第6行。
我现在的问题是:我怎样才能获得HEAD中的行号和其他提交(行被引入/修改的提交,或之后的提交)中的行号之间的Map?在我的例子中,我需要一个如下所示的Map(对于输入5):

  • 头部:5
  • a:6
  • ba和HEAD之间的另一个提交):7

因为行内容可能在文件中出现过多次,我不能简单地搜索它,但显然git知道哪一行是哪一行(-〉git blame)。
有没有一个'纯' git解决方案,或者有没有什么库可以解决这个问题?

hyrbngr7

hyrbngr71#

以Linux内核为例,假设我们正在查找v5.0中的2616行,我们想知道它在v5.15中的结果是什么:

$ git grep -n 'SYSCALL_DEFINE.*unshare' v5.0 -- kernel/fork.c 
v5.0:kernel/fork.c:2616:SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)

我们可以直接在新版本中查找它,记住这只是为了让我们知道正确的答案应该是什么:

$ git grep -n 'SYSCALL_DEFINE.*unshare' v5.15 -- kernel/fork.c 
v5.15:kernel/fork.c:3149:SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)

为了回答这个问题,我们可以这样使用git blame

$ git blame -L 2616,+1 --reverse v5.0..v5.15 --porcelain -- kernel/fork.c 
8bb7eca972ad531c9b149c0a51ab43a417385813 3149 2616 1
[...]

它似乎找到了正确答案:3149.
我不能100%确定这在一般情况下是否有效,但我想我会分享我的发现。

相关问题