다음 텍스트가 포함된 파일( )이 있다고 가정해 보겠습니다 myfile.txt
.
The quick brown fox jumps over the lazy dog.
myfile.txt
이 파일의 이름 을 에서 으로 변경했습니다 mystory.txt
. 이 이름 변경을 나타내는 diff를 어떻게 생성합니까? 이름을 바꿀 수 patch
있도록 공급할 수 있는 diff를 어떻게 생성할 수 있습니까 ? 파일 내용은 변경되지 않고 파일 이름만 변경됩니다.myfile.txt
mystory.txt
저는 diff
GNU diffutils와 patch
GNU 패치를 사용하고 있습니다.
답변1
차이점-N
옵션은 이러한 목적으로 사용됩니다.
-N, --new-file
treat absent files as empty
예를 들어
$ mkdir foo
$ ls -l >foo/listing
$ cp -r foo foo2
$ mv foo2/listing foo2/listing2
$ diff -r -N foo foo2 >/tmp/diff
새 파일로 "foo2/listing"을 표시하는 목록이 생성됩니다.
명령줄diff
다음과 같이 표시되지 않습니다.이름 바꾸기, 하지만 패치로 항목을 제거/추가할 수 있습니다. diff는 비교만 하기 때문에 "이름이 변경됨"으로 표시되지 않습니다.콘텐츠파일의 inode 값(동일한 파일 시스템에서 이름을 바꾸면 보존됩니다). 대신 git
(사용하는 경우그것은이름 바꾸기 기능) 이름 바꾸기가 표시됩니다. Git
물론 속일 수도 있지만 다음보다 훨씬 더 복잡합니다.diff
.
답변2
GNU 패치는 2012년 마지막 릴리스 이후 Git 스타일 diff 파일 이름 변경 기능을 지원합니다. Git을 설치하지 않으려면 수동으로 패치 파일을 직접 만들 수 있습니다.
diff --git a/myfile.txt b/mystory.txt
similarity index 100%
rename from myfile.txt
rename to mystory.txt
그리고 그것은 훌륭하게 작동합니다:
$ ls
myfile.txt rename.patch
$ patch < rename.patch
patching file myfile.txt (renamed from mystory.txt)
$ ls
mystory.txt rename.patch
답변3
패치는 파일 이름 바꾸기를 직접 나타내지 않으며 파일 삭제 및 생성으로 나타납니다. 이러한 패치를 생성하려면 원래 상태와 원하는 상태를 나타내는 두 개의 디렉터리가 필요합니다.
mkdir a b
echo "The quick brown fox jumps over the lazy dog." > a/myfile.txt
cp a/myfile.txt b/mystory.txt
a
원래 상태와 b
원하는 상태를 포함합니다. 패치를 생성하려면 다음을 실행하세요.
diff -urN a b > story.patch
-N
기본적으로 파일 비교는 다음을 사용하여 수행되므로 이 옵션이 필요합니다 -r
. diff
각 파일은 비교된 두 디렉터리 계층 모두에서 쌍으로 비교됩니다 . 이 옵션을 생략 하면 -N
일치하지 않는 파일은 "...에만 해당 내용이 무시됩니다."로 나열됩니다. 이 특별한 경우에는 를 사용하여 -N
파일 이 누락된 diff
것을 발견하여 가상의 빈 파일과 비교했으며 에서도 마찬가지였습니다 .b/myfile.txt
a/myfile.txt
b/mystory.txt
myfile.txt
이 패치를 적용하면 파일 이름을 바꾸는 것이 아니라 파일을 삭제하고 다음을 생성하여 원하는 상태가 됩니다 mystory.txt
.
patch < story.patch
(기본적으로 patch
패치에 지정된 경로의 첫 번째 디렉터리는 건너뜁니다.)