git 저장소의 일부 파일을 "cp -uav"하면 "삭제됨"이 표시되는 이유는 무엇입니까?

git 저장소의 일부 파일을 "cp -uav"하면 "삭제됨"이 표시되는 이유는 무엇입니까?

cp -uav커밋되지 않은 파일을 포함하여 git 저장소의 복사본을 업데이트한 적이 있습니다.

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

$ 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/bf350cea1fb4fd036235d7e6c36eb600e688 복사 85" ", 0) = -1 EEXIST(파일이 존재함 )

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

linkat(AT_FDCWD,"/repos/g/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e68885 복사", AT_FDCWD,"/repos/h/.git/objects/2b/bf350cea1fb4fd036235d7e6c36eb600e688 복사 85"”, 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이 옵션의 특징이라고 생각합니다.

관련 정보