2017-10-17 4 views
0

어떻게 파일 (.json)이 자식 훅으로 커밋되지 않도록 할 수 있습니까?어떻게 파일 (.json)이 자식 훅으로 커밋되지 않도록 할 수 있습니까?

서버에 아직 .json이 있습니다. 그래서 나는 gitignore를 사용할 수 없다. 하지만 지금은 누군가가이 파일을 변경하는 것을 허용하고 싶지 않습니다. 로컬 후크를 사용하고 싶습니다.

어떻게 커밋에서 특수 파일을 가져올 수 있습니까?

이 방법을 알려주십시오.

도움 주셔서 감사합니다.

+0

자동 생성 된 파일이나 코드 파일이 커밋되지 않도록 하시겠습니까? – LethalProgrammer

+0

설명하기가 조금 복잡합니다. 나는 특수 파일이 커밋 될지 확인하고 파일이 커밋에있는 경우 커밋을 중단하기를 원합니다. – Coder949

+2

예 가능합니다. 커밋하는 동안 트리거되는 pre-commit 훅 규칙을 작성하여 존재할 경우 파일을 제거한 다음 커밋합니다. – LethalProgrammer

답변

3

pre-commit 샘플 : 최선을 다하고 될 예정

#!/bin/bash 

ipath="foo/bar.json" 
git diff --cached --name-only | if grep -qE "^$ipath$";then 
    git reset HEAD -- "$ipath" 
    echo "Warning: $ipath is removed from the index. It's not allowed to be committed." 
fi 

git diff --cached --name-only 목록의 모든 변경된 파일. 목록에 foo/bar.json이 있으면 git reset HEAD -- foo/bar.json은 인덱스에서 제거하여 커밋되지는 않지만 작업 트리에 남겨 둡니다.

잘 작동합니다. 그러나 당신은 다른 사람들에게 그것을 보장 할 수는 없습니다. 예를 들어, 다른 참여자는 로컬 저장소에서 해당 기여자를 삭제할 수 있습니다. 필요한 것은 서버 저장소에있는 pre-receive 훅입니다. 들어오는 커밋이 foo/bar.json을 터치하면 밀어 넣기를 거부합니다.

pre-receive 샘플 :

#!/bin/bash 

ipath="foo/bar.json" 
zero="0000000000000000000000000000000000000000" 

while read old new name;do 
    if [ "$zero" == "$old" ];then 
     #creating new ref, do something here 
     continue 
    fi 

    if [ "$zero" == "$new" ];then 
     #deleting a ref, do something here 
     continue 
    fi 

    #updating a ref, check if the incoming commits touch `foo/bar.json` 
    git diff $old..$new --name-only | if grep -qE "^$ipath$";then 
     c=$(git log $old..$new --pretty=%H -- $ipath) 
     echo "Error: $ipath is changed in:" 
     echo $c 
     echo "Error: $ipath is not allowed to be committed and pushed." 
     exit 1 
    fi 
done 

공헌자는 git push 후 오류 메시지가 나타납니다. 다른 커밋을 시도하기 전에 커밋을 수정하고 foo/bar.json의 변경 사항을 제거해야합니다. pre-receive에서 필요한 경우 deleting a refcreating a ref을 처리해야합니다.

+0

고마워요! 문제는 서버 측에서 지원하지 않는다는 것입니다. 그래서 나는 그것을 지역적으로해야만한다. 그러나 첫번째 부분은 나에게 그것을 로컬로 바로 할 것인가? – Coder949