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

나는 이것과 중복되는 두 가지 질문을 보았습니다(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.txtOrg/create_me.txtpatch다른입구.

두 번째 패치는 동일한 방식으로 작동합니다. 즉 , patch.Org/delete_me.txt

patch세 번째 방법은 경로의 첫 번째 부분을 무시 하도록 지정했기 때문에 작동합니다 . Org또는 Upd. 따라서 . create_me.txt라는 파일이 생성됩니다 Org.

첫 번째 예제가 작동하도록 하려면 patch 에서 바꿀 수 있습니다 Upd/create_me.txt.Org/create_me.txt

관련 정보