代码之家  ›  专栏  ›  技术社区  ›  ataraxis

检查是否已应用git apply

  •  10
  • ataraxis  · 技术社区  · 7 年前

    这个问题是关于 git apply

    有没有办法区分:它之所以失败是因为。。。

    1. ... 修补程序 已经是 应用
    2. ... 源代码是 真正地 不同的

    我工作的目录不是git目录,因此我无法使用 git log 或者别的什么。

    我知道 -R (反向)选项,因此我当前的解决方法是:

    git apply abc.patch || git apply abc.patch -R --check && echo already applied
    

    这边 git apply abc.patch -R --check && git apply abc.patch 仅在以下情况下执行 git apply abc.patch 失败,然后检查是否由于已应用修补程序而失败( git apply abc.patch -R --check )如果是这样的话,它会呼应“已经应用”

    但我不喜欢它,git的apply中难道没有类似于内置解决方案的东西吗?

    2 回复  |  直到 7 年前
        1
  •  5
  •   torek    7 年前

    简而言之,答案是否定的,或者至少不是笼统的。

    考虑:a 色斑 是一组指示,上面写着“删除这一行”和“添加这些其他行”。假设修补程序 file 全文如下:

    diff --git a/file b/file
    index 87cdbbd..3d8696b 100644
    --- a/file
    +++ b/file
    @@ -7,4 +7,3 @@ this file is dull
     this file is dull
     this file is dull
     this file is dull
    -this file is dull
    

    换句话说,输入文件非常枯燥,至少在接近结尾时,它只是不断重复“这个文件很枯燥”。

    这个 改变 对文件来说,就是删除其中一条枯燥的行。这个 上下文 更多的是,同样枯燥的线条,然后是“文件结束”。

    由于生成了修补程序,有人修改了 顶部 这样文件就不再只有10行(或9行)枯燥的线条,但它仍然以至少四行枯燥的线条结尾。该文件现在有50多行,最上面的大多数都非常令人兴奋,至少相对而言。

    可以 ,作为一个聪明人,告诉我这个文件的补丁是否已经应用了?我只想告诉你补丁 可能已应用,也可能未应用 ,以及在文件顶部添加了许多激动人心的行的其他更改。

    如果你说不出来,为什么你会相信Git可以?我不知道你的情况,但是 不知道增加了激动人心的台词的变化是否也删除了最后一句枯燥的台词。

    (现在,在某些情况下,特别是如果你有 index 87cdbbd..3d8696b 100644 linethere公司 一种判断的方式, 假如 您还拥有哈希ID为的文件的提交版本 87cdbbd ,因为现在我们可以提取 版本 文件的。但是您没有说明是否有索引行,如果有,是否还有一个具有匹配哈希ID的blob。)

        2
  •  2
  •   LB--    4 年前

    事实上 git apply --reverse --check 您正在寻找的“git内置”解决方案。对于像其他答案中描述的许多相同的行这样的情况,您所需要做的就是确保修补程序文件有更多/足够的上下文来消除歧义(例如 git diff -U60 ).

    示例:如果修补程序说“删除这50条相同的线中的一条,留下49条”,则会产生明确的结果:

    • 如果这些线少于49条或超过50条,则修补程序不适用:两者都适用 get apply --check git应用--反向--检查 将失败。
    • 对于其中的49条线,已经应用了修补程序: git apply --check 将失败,并且 git应用--反向--检查 将会成功。
    • 其中有50条线尚未应用修补程序: git应用--检查 将成功,并且 git应用--反向--检查 将失败。
    • 如果 获取应用--检查 git应用--反向--检查 两者都成功了,您需要增加补丁的上下文以消除歧义。

    您甚至可以通过编程方式重复递增修补程序的上下文进行测试,直到它按预期工作为止(如果您不是手动执行)。