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.