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.txt
Org/create_me.txt
patch
다른입구.
두 번째 패치는 동일한 방식으로 작동합니다. 즉 , patch
.Org/delete_me.txt
patch
세 번째 방법은 경로의 첫 번째 부분을 무시 하도록 지정했기 때문에 작동합니다 .즉 Org
또는 Upd
. 따라서 . create_me.txt
라는 파일이 생성됩니다 Org
.
첫 번째 예제가 작동하도록 하려면 patch 에서 바꿀 수 있습니다 Upd/create_me.txt
.Org/create_me.txt