git의 후크에 대한 심볼릭 링크


86

나만의 커스텀 post-merge hook을 작성했고, 이제는 "hooks"디렉토리를 내 메인 프로젝트 폴더에 추가했습니다 (git은 .git / hooks의 변경 사항을 추적하지 않기 때문입니다). 어딘가에 후크에서 심볼릭 링크를 만들 수 있다고 읽었습니다. .git / hooks로 변경하여 누군가 파일을 변경할 때마다 한 폴더에서 다른 폴더로 파일을 복사 할 필요가 없으므로 시도했습니다.

ln -s -f hooks/post-merge .git/hooks/post-merge

그러나 작동하지 않는 것 같습니다. 이유가 무엇입니까? "ln hooks / post-merge .git / hooks / post-merge"는 잘 작동하지만 하드 링크를 만드는 것은 copyin과 동일합니다 ....


22
심볼릭 링크는 위치를 기준으로 확인되기 때문입니다. 에있는 심볼릭 링크 .git/hooks/그 점하기 hooks/post-merge에 해결됩니다 .git/hooks/hooks/post-merge존재하지 않는다. 당신은 원합니다 ln -s -f ../../hooks/post-merge .git/hooks/post-merge. 또는 당신의 삶을 더 쉽게 만드십시오 : ln -s -f ../hooks .git/hooks. 귀하의 문제는 git과 관련이 없습니다.
Aristotle Pagaltzis

1
stackoverflow.com/questions/3462955/…stackoverflow.com/questions/427207/… (및 stackoverflow.com/questions/3703159/… )은 심볼릭 링크가 작동 할 수 있다는 사실을 지적합니다.
VonC 2011 년

내가 틀렸다면 정정하십시오. 그러나 Symlink는 여전히 워크 스테이션별로 설정되어야합니다. 이것이 저장하는 유일한 것은 수동으로 복사하거나 추적 된 후크 파일을 .git/hooks.
adi518

답변:


161

잘못된 경로를 사용했습니다. 다음과 같아야합니다.

ln -s -f ../../hooks/post-merge .git/hooks/post-merge

10
내가 cd들어간 폴더에있는 리소스를 연결하기 위해 두 개의 디렉터리를 올라 가야하는 이유를 이해할 수 없습니다 . 그냥 그래야하지 ln -s ./hooks/않나요?
Droogans

45
이. git이 심볼릭 링크를 평가할 때 .git/hooks작업 디렉토리로 사용하기 때문에 상대 경로는 해당 디렉토리에 상대적이어야합니다. 심볼릭 링크를 만들기 전에 먼저 cd시작 .git/hooks하고 거기에서 상대 경로를 파악 하면 더 자명 합니다.
Eliot 2014

12
@Eliot는 심볼릭 링크의 생성이나 해결 모두 작업 디렉토리의 영향을받지 않습니다. 당신이 제공하는 것은 무엇이든 ln대상으로 저장되고 링크의 위치와 관련하여 해결됩니다.
Joó Ádám

2
@ JoóÁdám 당신 말이 맞아요. 따라서 여기서 문제는 원래 명령이 잘못된 상대 경로를 지정한다는 것입니다. 그러나 cd로 보내고 .git/hooks링크를하기 전에하면 다음 올바른 경로를 자동으로 완성 할 수 있습니다 당신이 명령을 작성하는 데 도움이됩니다.
엘리엇

1
이 모든 것이 결국 나를 위해 일했습니다. 유일한 차이점은 내 자신의 prepare-commit-msg. 문제는 nano를 사용하여 커밋 메시지를 편집하고 Ctl + X를 중단하여 중단하면 git 은이 변경을 수행하기 전에 사용했던 것과 같이 중단하는 대신 커밋을 완료합니다. 이 커밋을 완료하지 않고 나노 종료를 할 수있는 방법이 있습니까?
frakman1

15

심볼릭 링크를 사용할 수 있지만 다음을 사용하여 git 설정에서 프로젝트의 후크 폴더를 변경할 수도 있습니다.

git config core.hooksPath hooks/

기본적으로 로컬이므로 다른 프로젝트의 git 후크를 망치지 않습니다. 이 저장소의 모든 후크에서 작동하므로 후크가 두 개 이상인 경우 특히 유용합니다.

.git/hooks/팀과 공유하고 싶지 않은 사용자 지정 후크가 이미있는 경우 후크 /에 추가하고 .gitignore공유되지 않도록 추가 할 수 있습니다 .


아주 좋아요! 편리한 트릭 :) 하나씩 심볼릭 링크하는 것보다 훨씬 미래 지향적입니다.
jkp

2

연결하기 전에 디렉토리 변경

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge

더 간단한, 이후 cd:ln -s -f ../../hooks/post-merge
jamesdlin

0

경로 계산은 심볼릭 링크를 기준으로 수행됩니다. 예를 들어 이해합시다.

ln -s path/to/file symlink/file

여기서 파일 경로는 실제로 심볼릭 링크 경로의 상대 경로 여야합니다.
시스템은 실제로 파일 경로를 계산합니다 symlink/path/path/to/file
. 위의 명령은

ln -s ../path/to/file symlink/path

폴더 구조가 다음과 같이 다시 작성되어야합니다 .

/ code
------ 심볼릭 링크 / 파일
------ 경로 / 대상 / 파일


0

Michael Cihar의 설명을 활용하여 이러한 심볼릭 링크를 간단히 생성하기 위해 작성한 bash 스크립트의 예가 있습니다. 이 스크립트는 프로젝트 루트에있는 git_hooks / dir에 있습니다. 내 .git / 폴더도 동일한 디렉토리 수준에 있습니다.

#!/usr/bin/env bash

pwd=$(pwd);

# Script is designed to be ran from git_hooks/ dir
if [[ "$pwd" == *"git_hooks"* ]]; then

  files=$(ls | grep -v -e '.*\.');

   while read -r file; do

     ln -s ../../git_hooks/$file ../.git/hooks/
     echo "Linked $file -> ../.git/hooks/$file"

   done <<< "$files";

else

  echo "";
  echo "ERROR: ";
  echo "You must be within the git_hooks/ dir to run this command";
  exit 1;

fi

내 스크립트는 실제 git_hooks / 디렉토리 내에서 실행되어야합니다. 원하는 경우 다르게 작동하도록 수정할 수 있습니다.

이 스크립트는 git_hooks / 디렉토리 내에서 파일 확장자가 접미사가없는 모든 파일을 심볼릭 링크합니다. 이 디렉토리에 README.txt와이 스크립트 (symlink.sh라는 이름)가 있습니다. 모든 실제 git 후크는 'pre-commit', 'pre-push'등으로 명명되어 심볼릭 링크됩니다.


-2

왜 그냥 cp ./hooks/* .git / hooks /

이것은 Mac OS에서 나를 위해 일했습니다.


15
왜냐하면I don't have to copy the file from one folder to the other every time someone changes
George Dimitriadis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.