Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当使用svn cp或svn mv时,如何使svn diff生成补丁将应用的文件?_Svn_Merge_Diff_Patch - Fatal编程技术网

当使用svn cp或svn mv时,如何使svn diff生成补丁将应用的文件?

当使用svn cp或svn mv时,如何使svn diff生成补丁将应用的文件?,svn,merge,diff,patch,Svn,Merge,Diff,Patch,情况是: svn cp或mv某些文件 修改那个文件 svn diff>mypatch 在其他机器上(相同的工作副本,但没有更改): 尝试应用mypatch 失败->尝试修改不存在的文件 在这种情况下,如何使svn diff生成可应用补丁,或干净地应用svn diff生成的补丁?我不能承诺。我想保留mergeinfo(因为显而易见的解决方法是将文件作为全新文件添加,而不连接到上一个文件)。使用subversion,您可以指定要使用的diff二进制文件以及要传递给它的参数。请参见svn差异 您希望从

情况是:

  • svn cp或mv某些文件
  • 修改那个文件
  • svn diff>mypatch
  • 在其他机器上(相同的工作副本,但没有更改):

  • 尝试应用mypatch
  • 失败->尝试修改不存在的文件

  • 在这种情况下,如何使svn diff生成可应用补丁,或干净地应用svn diff生成的补丁?我不能承诺。我想保留mergeinfo(因为显而易见的解决方法是将文件作为全新文件添加,而不连接到上一个文件)。

    使用subversion,您可以指定要使用的diff二进制文件以及要传递给它的参数。请参见svn差异

    您希望从svn diff生成常规修补程序文件,因此希望svn diff看起来像普通的diff。请尝试以下操作:

    svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
    ...
    patch -p0 < mypatch
    
    svn diff--diff cmd/usr/bin/diff-x“-i-b”>mypatch
    ...
    patch-p0
    概念证明:

    echo "newline" >> README.txt
    svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch
    cp README.txt README.txt.patched
    svn revert README.txt
    patch -p0 < mypatch
    diff README.txt README.txt.patched
    
    echo“newline”>>README.txt
    svn diff--diff cmd/usr/bin/diff-x“-i-b”>mypatch
    cp README.txt README.txt.patched
    svn revert README.txt
    patch-p0

    打补丁后,两个文件没有区别。

    如果不了解您试图处理的特定场景,很难确定您为什么要这样做。我感觉您试图在一个孤立的环境中进行受控更改,以避免影响其他用户/应用程序

    你能用下列方法解决这个问题吗

    • 为代码更改创建分支
    • 在分支上执行复制/移动和更改
    • 让另一方切换到此新代码分支并继续共享此分支
    当您双方都同意更改后,使用--reintegrate参数和rm分支将更改合并回主干中

    这会 *维护合并信息 *识别版本控制中的复制/移动和更改 *仍然将更改与其他用户隔离
    *在第2步中,将防止不完整的更改成为一个问题,因为您可以添加更多更改并更新

    您是否尝试过网页上提到并在页面上描述的
    --将副本显示为添加
    选项?

    如果您希望在修补程序中也删除svn属性,则有一个选项:

    svn diff --patch-compatible > mypatch.diff
    
    svn help diff
    说明:

      --patch-compatible   : generate diff suitable for generic third-party
                             patch tools; currently the same as
                             --show-copies-as-adds --ignore-properties
    

    以这种方式创建的补丁应该与良好的旧普通
    补丁
    实用程序兼容。

    但是,如果分支之间发生属性更改,则这不起作用。这对我不起作用。生成的修补程序文件仍将复制的文件显示为对原始文件的修改(例如,它有以-开头的行以及不以-或+开头的行)。此外,试图修补的结果是:“14个大块头中有12个失败了——将拒绝保存到文件中”。你有没有用一个实际包含内容的源文件和一个内容与源文件不同的目标文件尝试过这个方法?我在寻找完全相同的东西,这很有魅力,感谢你遵循OP的步骤(svn mv,修改新文件)和你的差分和修补命令,我得到了与OP声明相同的结果-patch抱怨新文件不存在,因此它不知道修补什么。这比投票数更多的答案更接近预期结果。这实际上是从移动的文件中删除内容,并为新文件添加正确的修改。但它将原始文件显示为仅修改过且没有内容,而将新文件显示为未版本文件。不过,这是迄今为止我对原始问题看到的最好答案。