
나는 git commit Hook을 작성하고 이라는 저장소에서 테스트했습니다 myrepo
. 이제 ~/repos
폴더의 모든 저장소 에 복사하고 싶습니다 . 이를 위해 나는 다음을 시도했습니다.
$ cd ~/repos/myrepo/.git/hooks
$ cp prepare-commit-msg ~/repos/*/.git/hooks
이것을 실행하면 cp
각 디렉토리에 다음 메시지가 나타납니다 repos
.
cp: -r not specified; omitting directory <directory-name>
prepare-commit-msg
나는 이것이 디렉토리가 아니라고 100% 확신합니다 . 왜 cp
내가 그것을 사용하지 않았다고 불평합니까 -r
?
답변1
find
그것은 당신이 찾고 있는 도구일 수도 있습니다. 이를 사용하여 지정되고 폴더 hooks
아래에 있는 모든 디렉터리를 찾을 수 있습니다 ~/repos/
. 찾은 각 디렉토리에 대해 find
거기에 파일을 복사하도록 지시합니다.
myrepo
이로 인해 저장소가 파일을 자신에게 복사하려고 시도할 때 오류 메시지가 표시되지만 오류는 무시할 수 있습니다.
cd ~/repos/myrepo/.git/hooks
find ~/repos/ -type d -name hooks -exec cp -vp prepare-commit-msg {} \;
이 명령은 디렉터리나 파일 이름에 이상한 문자가 있는 경우를 처리하도록 개선될 수 있지만 이것이 요점입니다.
원래 cp
명령이 작동하지 않는 이유에 대해 더 잘 설명하는 질문이 있을 수 있지만 이는 셸이 명령을 다음과 같이 확장하기 때문입니다.
cp prepare-commit-msg ~/repos/repo_A/.git/hooks ~/repos/repo_B/.git/hooks ~/repos/repo_C/.git/hooks ~/repos/repo_D/.git/hooks ~/repos/repo_E/.git/hooks
해당 구문이 주어 cp
지면 파일 prepare-commit-msg
과 4개의 디렉터리를 복사 ~/repos/repo_A/.git/hooks
하고 ~/repos/repo_D/.git/hooks
복사된 모든 파일/디렉터리 를 ~/repos/repo_E/.git/hooks
. t 디렉토리를 재귀적으로 복사합니다.cp
-r
원래 구문과 유사한 솔루션을 구축하려면 다음을 사용할 수 있습니다.
cd ~/repos/myrepo/.git/hooks
dirs=( ~/repos/*/.git/hooks )
for d in "${dirs[@]}"
do
cp -vp prepare-commit-msg "$d/"
done
답변2
cp
자신만의 래퍼를 사용할 수 있습니다 cp2dirs
.
function cp2dirs(){
from="$1";shift
[ -f "$from" ] && while (($#)); do cp "$from" "$1/"; shift; done
}
그리고 cp2dirs prepare-commit-msg ~/repos/*/.git/hooks
뭐