diff / patchについて学んでいますが、次のコマンド順序で生成されたパッチファイルを適用しようcreate_me.txt
とすると、ディレクトリ内にファイルが生成されない理由がわかりません。Org
ファイルの作成
$ ls -R
Org Upd
./Org:
./Upd:
create_me.txt
$ diff -ruN Org/ Upd/ > Org.patch
$ cat Org.patch
diff -ruN Org/create_me.txt Upd/create_me.txt
--- Org/create_me.txt 1970-01-01 01:00:00.000000000 +0100
+++ Upd/create_me.txt 2019-06-30 21:12:36.000000000 +0200
@@ -0,0 +1 @@
+content
$ patch -p0 < Org.patch
The next patch would create the file Upd/create_me.txt,
which already exists! Assume -R? [n]
このフラグは、欠落しているファイルを空のファイル-N --new-file
として扱い、欠落しているディレクトリのデフォルトのタイムスタンプを使用します。create_me.txt
フラグを使用してファイルを削除すると-N
(以下を参照)、うまくいきますが、逆にすると、上記のコマンドシーケンスに表示されるエラーメッセージが表示されることがわかりません。
ファイルの削除
$ ls -R
Org Upd
./Org:
delete_me.txt identical.txt
./Upd:
identical.txt
$ diff -ruN Org/ Upd/ > Org.patch
$ cat Org.patch
diff -ruN Org/delete_me.txt Upd/delete_me.txt
--- Org/delete_me.txt 2019-06-30 21:32:50.000000000 +0200
+++ Upd/delete_me.txt 1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-content
$ patch -p0 < Org.patch
patching file Org/delete_me.txt
$ ls -R
Org Org.patch Upd
./Org:
identical.txt
./Upd:
identical.txt
私はこれと重複する2つの質問を見ました(https://stackoverflow.com/questions/23528758/how-to-create-patch-for-a-new-file-and-patch-it-back-to-the-original-directory、
https://askubuntu.com/questions/975879/patch-command-cant-create-the-new-file)しかし、どんな答えも私を満足させませんでした。これらの答えは、作業ディレクトリをファイルが作成される元のディレクトリに変更し、そこからパッチを適用することで問題を解決します。このアプローチはうまくいきますが、diff / patchを使用する目的には拡張されないため、すべてのディレクトリで機能し、パッチ-p0
フラグを使用するより一般的なソリューションが必要です。
現在の回答のファイルを生成する方法
$ ls -R
Org Upd
./Org:
identical.txt
./Upd:
create_me.txt identical.txt
$ diff -ruN Org/ Upd/ > Org.patch
$ cat Org.patch
diff -ruN Org/create_me.txt Upd/create_me.txt
--- Org/create_me.txt 1970-01-01 01:00:00.000000000 +0100
+++ Upd/create_me.txt 2019-06-30 21:53:09.000000000 +0200
@@ -0,0 +1 @@
+content
$ cd Org
$ patch -p1 < ../Org.patch
patching file create_me.txt
$ ls -R ..
Org Org.patch Upd
../Org:
create_me.txt identical.txt
../Upd:
create_me.txt identical.txt
現在の回答が機能し、私のバージョンが機能しない理由の説明も歓迎します。
答え1
最初のパッチとその適用方法では、代わりに次patch
のファイルを作成する必要があります。フルパスが重要です。 Epoch(170-01-01 00:00:00 UTC)日付の項目を見ると、この項目が存在しないファイルであることがわかり、その項目が「開始」項目の場合はファイルを作成する必要があることがわかります。 「終了」項目であり、ファイルを削除する必要があることがわかっている場合。作成または削除されるファイルの名前は、次から取得されます。Upd/create_me.txt
Org/create_me.txt
patch
その他入り口。
2番目のパッチは同じ方法で動作します。つまり、patch
。Org/delete_me.txt
patch
3番目の方法は、パスの最初の部分を無視するように指定したために機能します。つまり Org
またはUpd
。したがって。create_me.txt
というファイルが作成されますOrg
。
最初の例が機能するようにするには、patchで置き換えることができますUpd/create_me.txt
。Org/create_me.txt