Git으로 파일 복사 작업 기록


141

git-mv를 사용하여 git에서 파일을 이동하면 상태가 파일 이름이 바뀌 었음을 보여 주며 일부 부분을 변경해도 여전히 거의 같은 것으로 간주됩니다 (이력을 따라갈 수 있기 때문에 좋습니다) .

파일을 복사 할 때 원본 파일에 몇 가지 기록이 있습니다. 새 사본과 연결하고 싶습니다.

파일 이동을 시도한 다음 원래 위치에서 다시 체크 아웃하려고했습니다. 한 번 이동하면 자식 위치로 원래 위치를 체크 아웃 할 수 없습니다.

파일 시스템 복사를 시도한 다음 파일을 추가하려고 시도했습니다-자식은 파일을 새 파일로 나열합니다.

히스토리를 원래 파일로 추적 할 수있는 파일 이름 바꾸기 / 이동을 기록하는 방법과 비슷한 방식으로 git record 파일 복사 작업을 수행하는 방법이 있습니까?

답변:


112

Git은 이름 변경 추적이나 복사 추적을 수행하지 않으므로 이름 변경이나 사본을 기록 하지 않습니다 . 대신 이름 바꾸기 및 복사 감지가 수행 됩니다. 당신은 이름 바꾸기에서 감지 요청할 수 있습니다 git diff(및 git show사용) -M옵션을, 당신은 사용하여 변경된 파일에 추가 복사본 탐지를 요청할 수 있습니다 -C옵션 ( -C의미를 -M), 당신은 모든 파일들 사이에서 더 비싼 복사 탐지를 요청할 수 있습니다 --find-copies-harder또는 -C -C의미있는 ( -C의미있는, -M). git-diff 맨 페이지를 참조하십시오 .

당신은 또한 구성 자식에 항상 설정하여 이름 바꾸기 감지 할 diff.renames부울 진정한 가치 (예 :에 true또는 1), 당신은으로 설정하여도 복사 감지 할 자식을 요청할 수 있습니다 copy또는 copies. git-config 맨 페이지를 참조하십시오 .

-l옵션 git diff및 관련 구성 변수 도 확인하십시오 diff.renameLimit.


git log <pathspec>Git에서 다르게 작동 한다는 점에 유의 하십시오. 여기서 <pathspec>경로 구분 기호 집합이 있습니다. 여기서 경로는 (하위) 디렉토리 이름 일 수 있습니다. 이름 변경 및 복사 감지가 시작 되기 전에 기록을 필터링하고 단순화 합니다. 이름 바꾸기 및 사본을 따르려면 git log --follow <filename>(현재 약간 제한되어 있으며 단일 파일에서만 작동합니다)를 사용하십시오.


1
@allyourcode : 당신이 혼란 스럽습니까? 사용자가 설정 기본적으로 복사 감지 켜려면 diff.renamescopies(예를 들어, ' git config diff.renames copies'). 나는 그것이 약간 반 직관적이라는 것에 동의합니다.
Jakub Narębski

구문 분석 할 수없는 한 섹션은 "기본적으로 이름 바꾸기 감지도 수행하도록 요청할 수 있습니다"입니다. diff.renames가 사용할 수있는 네 가지 값 (true, 1, copy, copy)이 있고 모두 같은 일을하고 있다고 말하고 있습니까?
allyourcode

1
@allyourcode : 죄송합니다, 나는 이것을 눈치 채지 못했습니다. 고맙습니다.
Jakub Narębski

4
@ peschü : Git은 컨텐츠 주소가 지정된 객체 데이터베이스를 저장소 스토리지로 사용합니다. 파일 내용은 SHA-1 해시 내용 인 주소 아래의 'blob'내용에 저장됩니다 (well, type + length + contents). 이는 주어진 내용이 한 번만 저장됨을 의미합니다. Nb. 이 자동 중복 제거는 git pack 형식을 사용하여 "bup"백업 시스템을 만든 이유입니다.
Jakub Narębski

1
아래 솔루션과 달리 범위의 변경 내용 추적에서는 작동하지 않습니다. 힘내 로그는 범위 git log -L123,456:file.xyz이름 ( )이 바뀐 이름 뒤에 올 수 있지만 복사 할 수는 없습니다.이 경우 --follow를 전달할 수 없습니다. 또한 AFAICT는 git blame과 함께 작동하지 않습니다.
Clément

57

2020-05-19 : 다음 솔루션은 원본 파일의 로그를 변경하지 않고 병합 충돌을 일으키지 않으며 더 짧다는 이점이 있습니다.

Git이 세 가지 커밋에서 복사 된 파일의 히스토리를 탐지하도록 강제 할 수 있습니다 :

  • 복사하는 대신 새 분기로 전환 하여 파일을 새 위치 로 이동 하십시오.
  • 원본 파일을 다시 추가하십시오.
  • 빨리 감기 없음 옵션을 사용하여 새 분기를 원래 분기에 병합하십시오 --no-ff.

(크레딧은 Raymond Chen으로 이동합니다 .)


이전 솔루션에는 네 가지 커밋이있었습니다.

  • 복사하는 대신 새 분기로 전환 하여 파일을 새 위치 로 이동 하십시오.
  • 원래 분기로 전환하고 파일 이름을 바꿉니다.
  • 새 파일을 원래 지점으로 병합하여 두 파일을 모두 유지하여 사소한 충돌을 해결하십시오.
  • 별도의 커밋으로 원래 파일 이름을 복원하십시오.

(솔루션은 https://stackoverflow.com/a/44036771/1389680 에서 가져 왔습니다 .)


7
단순성, 간결함, 100 % ...이 답변은 공공 서비스입니다 ... 모든 것을 눈에 띄는 것
ptim

1
무엇의 차이 moverename?
vovan

@vovan bash mv에서 두 작업 모두에 사용할 것이라는 사실을 언급하고 있습니까? 파일의 디렉토리를 변경하는 경우 'move'를 사용하고 그렇지 않은 경우 'rename'을 사용했습니다.
Robert Pollak 2016 년

2
나는이 (새로운) 레시피를 따르려고했지만 작동하지 않았습니다. 실제 명령을 표시하면 도움이 될 수 있습니다.
Greg Lindahl

1
@RobertPollak 나는 이것의 다양한 버전을 시도했지만 작동하지 않았습니다. "파일 이동"은 무슨 뜻 git mv orig new인가요? "원본을 읽었다"는 뜻 cp new orig && git add orig입니까?
ᆼ ᆺ ᆼ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.