为什么svn diff有时会将工作文件复制到临时文件?

时间:2008-12-28 13:57:08

标签: svn diff

我使用带有Subversion的外部差异工具(Beyond Compare规则!),其中一个很棒的功能是能够使用diff程序对文件进行一些小的编辑,因为我正在查看我所做的更改制成。

svn diff在我的不同项目中的工作方式不同。总之,左侧文件是一个临时文件,包含存储在Subversion(头部)中的最新版本。但在某些情况下,右侧文件是实际工作文件,而在其他文件中,它是工作文件的临时文件副本。在第一种情况下,我可以在diff程序中进行更改,它们会影响工作副本。在第二种情况下,我正在编辑临时文件,因此更改将丢失。

为什么Subversion有时会针对工作文件进行区分,但有时会针对工作文件的临时副本?如何让它始终使用工作文件?

3 个答案:

答案 0 :(得分:11)

您是否在这些文件上设置了svn:keywords?如果是,则Subversion将首先创建一个临时文件,其中包含所有扩展关键字的“未展开”。这是为了避免所有关键字行显示为不同,即使它们尚未更改。

例如,如果您将工作副本中的文件与BASE区分开来,则BASE文件没有扩展关键字(并且还存储有LF线端),而工作副本中的文件则扩展了所有关键字(可能是与CRLF lineendings一起存储)。 如果您没有在本地修改该文件,'svn diff'会显示所有行不同(如果行结尾不匹配)或至少所有带有关键字的行都会显示为不同 - 这不是你想要的期望的。

答案 1 :(得分:0)

也许存在一些访问问题。尝试将文件设置为只读,如果svn现在打开临时文件,这是您的问题的一个可能的答案。在这种情况下,您使用的某些编辑器/ IDE可能会对文件进行写保护。

答案 2 :(得分:0)

This email talked about alternative solution. 使用$ 5而不是$ 7来避免为$ svn diff创建临时文件。 传递$ 5后,使用--diff-cmd执行$ svn diff时,它将使用本地文件而不是tmp文件。

我尝试过。它确实将本地文件与svn repo中的远程文件进行比较。从$ 7更改为$ 5之前。 Meld总是比较两个临时文件。

示例

发件人

$svn diff --diff-cmd=svn-diff-meld  -r 12345 ./dirToCompare

$ cat /usr/local/bin/svn-diff-meld
#!/bin/sh
# SVN Diff Wrapper for Meld

left="$6"
right="$7"
meld "$left" "$right"

收件人

$svn diff --diff-cmd=svn-diff-meld  -r 12345 ./dirToCompare

$ cat /usr/local/bin/svn-diff-meld
#!/bin/sh
# SVN Diff Wrapper for Meld

left="$6"
right="$5"
meld "$left" "$right"