git repo의 `cp -uav`가 일부 파일에 대해 "제거됨"으로 표시되는 이유는 무엇입니까?

git repo의 `cp -uav`가 일부 파일에 대해 "제거됨"으로 표시되는 이유는 무엇입니까?

cp -uav커밋되지 않은 파일을 포함하여 git repo의 복사본을 업데이트하곤 했습니다 .

파일을 제거한다고 말한 이유는 무엇입니까? 다음과 같습니다.

$ cp -uav repos copy
removed 'copy/repos/h/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391'
removed 'copy/repos/h/.git/objects/3b/b3f834dd037db9298b10d71e0cd7383000fa1c'
removed 'copy/repos/h/.git/objects/49/6d6428b9cf92981dc9495211e6e1120fb6f2ba'
removed 'copy/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885'

$ rpm -q --whatprovides `which cp`
coreutils-8.25-17.fc25.x86_64

답변1

위의 메시지를 다음과 같이 재현할 수 있습니다.

mkdir test; cd test
mkdir repos; cd repos

mkdir g; cd g
git init
touch a
git add a
git commit -m test
cd ..

git clone g h
cd ..

mkdir copy
cp -ua repos copy
cp -uav repos copy

cp -ua아래 명령 을 실행하면 해당 파일이 strace실제로 제거( )되고 있음이 표시됩니다 .unlink

일어난 일은 의 개체가 의 repo/h/.git/objects개체의 하드링크라는 것입니다 repo/g/.git/objects. (원래의 경우 원래 기본 저장소의 복제본으로 생성된 하위 저장소가 포함된 저장소를 복사하고 있었습니다.)

cp -a을 의미하며 cp --preserve, 이는 다음과 같이 문서화되어 있습니다.

--보존[=ATTR_LIST]

가능한 경우 지정된 속성(기본값: 모드, 소유권, 타임스탬프)을 유지합니다. 추가 속성: 컨텍스트, 링크, xattr, 모두

링크 해제는 하드링크 보존의 일부로 발생합니다.

linkat(AT_FDCWD, "복사/repos/g/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885", AT_FDCWD, "복사/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885 ", 0) = -1 EEXIST(파일이 존재함)

unlink("복사/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885") = 0

linkat(AT_FDCWD, "복사/repos/g/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885", AT_FDCWD, "복사/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885 ", 0) = 0

나를 혼란스럽게 하는 메시지가 생성되는 정확한 이유는 무엇입니까?

이 코드에서는 -u( )가 제대로 구현되지 않은 것 같습니다 . --update이는 주로 데이터를 불필요하게 다시 복사하는 것을 방지하기 위한 성능 최적화입니다. 하드링크를 만들 때 데이터를 복사할 필요는 없습니다.

문서에서 cp파일을 제거해야 하는 다른 시나리오도 볼 수 있습니다.

   -f, --force

         if an existing destination file cannot be opened, remove it and try again (this option is ignored when the -n option is also used)

의 경우 -f"강제"해야 하는 특정 파일을 표시하려고 할 수도 있다는 것을 이해할 수 있습니다.

cp중단된 경우 삭제를 표시하는 것도 유용할 수 있다고 생각합니다 . 그렇지 않으면 사용자는 중간 단계로 파일이 대상에서 삭제되었을 수 있다는 사실을 깨닫지 못할 것입니다.

궁극적인 질문은 링크를 다시 생성할 때 메시지를 표시하지 않은 이유입니다. 이는 덜 혼란스럽습니다. 나는 이것이 옵션의 특징이라고 생각합니다 -u.

관련 정보