4

私はSVNに本当に慣れていないので、何が間違っているのかわかりません。

私は以下を含むリポジトリから始めます:

HelloWorld.java

コンピューターでワーキングセットを作成し、HelloWorld.javaをHelloWorldDe.javaにコピーします。次に、HelloWorld.javaの名前をHelloWorldEn.javaに変更し、HelloWorldDe.javaの1行を変更します。この後、以下を含むワーキングセットがあります。

HelloWorldEn.java <-- Renamed copy of HelloWorld.java
HelloWorldDe.java <-- Renamed copy of HelloWorld.java with one line change

SVNステータスを実行すると、次のようになります。

A HelloWorldDe.java
D HelloWorld.java
A HelloWorldEn.java

SVN diffを実行すると、次のようになります。

Index: HelloWorldDe.java
===================================================================
--- HelloWorldDe.java   (revision 0)
+++ HelloWorldDe.java   (revision 0)
@@ -0,0 +1,5 @@
+public class HelloWorld {
+  public static void main( String [] args ) {
+    System.out.println("Hallo welt!");
+  }
+}
Index: HelloWorld.java
===================================================================
--- HelloWorld.java (revision 13)
+++ HelloWorld.java (working copy)
@@ -1,5 +0,0 @@
-public class HelloWorld {
-  public static void main( String [] args ) {
-    System.out.println("Hello World!");
-  }
-}
Index: HelloWorldEn.java
===================================================================
--- HelloWorldEn.java   (revision 0)
+++ HelloWorldEn.java   (revision 0)
@@ -0,0 +1,5 @@
+public class HelloWorld {
+  public static void main( String [] args ) {
+    System.out.println("Hello World!");
+  }
+}

ただし、元のワーキングセットで「patch-p0 -i German.diff」を実行しようとすると、次のようになります。

HelloWorld.java <-- Empty file
HelloWorldEn.java
HelloWorldDe.java

ファイルが削除されるのではなく、空のファイルが表示される理由を誰かが説明できますか?

4

3 に答える 3

1

1.まず、いくつかの質問

  1. どのバージョンsubversionを使用していますか?(パート3を参照)
  2. German.diffをどのように生成していますか?German.diffsvn diffは、あなたが提示したものとまったく同じように見えると思いますか?

2.パッチファイルを削除します

patch通常はデフォルトですべての行を削除することによってそれ自体が空になるファイルを削除しますが、manページに記載されているように、実装によって異なります。差出人man patch

-Eまたは--remove-empty-files

パッチが適用された後に空の出力ファイルを削除します。通常、このオプションは不要です。パッチはヘッダーのタイムスタンプを調べて、パッチ適用後にファイルが存在するかどうかを判断できるためです。ただし、入力がコンテキスト差分でない場合、またはパッチがPOSIXに準拠している場合、このオプションが指定されていない限り、パッチは空のパッチファイルを削除しません。patchがファイルを削除すると、空の祖先ディレクトリも削除しようとします。

このオプションを強制--posixするか、決定論的な動作を強制することができます。その場合は、patchそのファイルを削除する必要があります。

注:は誤解を招く可能性があります。サイズ=0バイトのように、本当に空ですか?それとも\n、そこに文字が入っているだけで、テキストはありませんか?本当に空のファイルは悪夢であることがわかりましたpatchが、それによってファイルが空になる場合は、それらを削除する必要があります。

3.svnバグがあります

一部のバージョンのsvndiffは、移動/名前変更/削除されたファイルをdiffにまったく入れません!そしてそれはあなたがdiffをどのように呼ぶかに依存します。したがって、提供しているパッチファイル(German.diff)に、パッチ内にそのファイルのエントリが実際に含まれていることを確認してください。そうでない場合、これに苦しむ可能性があります。patch

http://svn.haxx.se/dev/archive-2004-03/0333.shtmlを参照してください。SVN DEVリストからのこのアーカイブされた電子メールは、10年以上前に、1.0.1がリリースされる前に、開発者自身がこの問題を特定したことを示しています。

私の経験では、この問題はSVN1.7で修正されました。

于 2015-06-09T18:27:23.053 に答える
0

これは、パッチがファイルを削除しないためです。パッチファイルの内容で変更するだけです。したがって、この:

--- HelloWorld.java (revision 13)
+++ HelloWorld.java (working copy)
@@ -1,5 +0,0 @@
-public class HelloWorld {
-  public static void main( String [] args ) {
-    System.out.println("Hello World!");
-  }
-}

HelloWorld.javaは削除されません。削除されるのは、で示されたすべての行だけ-です。これはすべてです。

行った変更をコミットしてから実行するとsvn up、ファイルは削除されます。しかし、パッチはsvnではありません。

于 2012-08-25T18:41:53.377 に答える
0

これに対する更新として、patchコマンドの-Eオプションを使用して、パッチが適用された後に空のファイルを強制的に削除することができます。

https://www.tutorialspoint.com/unix_commands/patch.htmを参照してください

于 2018-03-02T13:06:53.180 に答える