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
이 옵션의 특징이라고 생각합니다.