diff/patch を使用してディレクトリに新しいファイルを作成する

diff/patch を使用してディレクトリに新しいファイルを作成する

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-directoryhttps://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.txtOrg/create_me.txtpatchその他入り口。

2番目のパッチは同じ方法で動作します。つまり、patchOrg/delete_me.txt

patch3番目の方法は、パスの最初の部分を無視するように指定したために機能します。つまり OrgまたはUpd。したがって。create_me.txtというファイルが作成されますOrg

最初の例が機能するようにするには、patchで置き換えることができますUpd/create_me.txtOrg/create_me.txt

関連情報