git에는 `svn propset svn:keywords`나 커밋 전/후 후크 같은 것이 있나요?

StackOverflow https://stackoverflow.com/questions/39742

  •  09-06-2019
  •  | 
  •  

문제

git 문서를 검색해 보면 SVN의 커밋 후크나 파일이 저장소에 커밋될 때마다 파일 내의 버전 번호나 저작권 표시를 업데이트할 수 있는 "propset" 기능과 유사한 것을 볼 수 없습니다.

git 사용자는 이런 종류의 기능을 위해 외부 스크립트를 작성해야 합니까(의문의 여지가 없는 것 같습니다) 아니면 제가 방금 명백한 것을 놓친 것입니까?

편집하다 :분명히 말씀드리자면 저는 다음에 더 관심이 있습니다.

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

다음과 같은 문자열이 있습니다.

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

커밋이 발생할 때마다 관련 정보를 최신 상태로 유지합니다.

도움이 되었습니까?

해결책

에서 인용 힘내 FAQ:

git에 키워드 확장 기능이 있나요?

권장되지 않습니다.키워드 확장은 모든 종류의 이상한 문제를 일으키고 어쨌든 특히 SCM의 컨텍스트 내에서 실제로 유용하지 않습니다.밖 git 스크립트를 사용하여 키워드 확장을 수행 할 수 있습니다.Linux 커널 내보내기 스크립트는 Makefile에서 EXTRA_VERSION 변수를 설정하기 위해 이 작업을 수행합니다.

정말로 이 작업을 수행하려면 gitattributes(5)를 참조하십시오.번역이 그렇지 않은 경우 되돌릴 수 있음(예: SCCS 키워드 확장) 문제가 될 수 있습니다.

다른 팁

나는 글을 썼다 상당히 완전한 답변 이를 수행하는 방법을 보여주는 코드와 함께 다른 곳에서 이 작업을 수행합니다.요약:

  1. 당신은 아마 이것을하고 싶지 않을 것입니다.사용 git describe 합리적인 대안입니다.
  2. 꼭 이 작업을 수행해야 한다면, $Id$ 그리고 $Format$ 상당히 쉽습니다.
  3. 더 발전된 기능을 사용하려면 다음을 사용해야 합니다. gitattributes 그리고 사용자 정의 필터.나는 구현 예를 제공합니다. $Date$.

후크 기능을 기반으로 한 솔루션은 작업 복사본을 지저분하게 만들기 때문에 일반적으로 도움이 되지 않습니다.

Git에는 커밋 전 후크와 커밋 후 후크가 있으며 각 .git/hooks 디렉터리에 있습니다.파일을 수정하고 chmod를 실행하여 실행 가능하게 만드세요.

아마도 가장 일반적인 SVN 속성인 'svn:ignore'는 메타데이터가 아닌 .gitignore 파일을 통해 수행됩니다.유감스럽게도 다른 종류의 메타데이터에 대해 이보다 더 도움이 되는 것은 없습니다.

오래된 Q&A이긴 하지만.오랫동안 나를 괴롭혔기 때문에 하나 던져야겠다고 생각했습니다.

나는 시간 역순으로 디렉토리의 파일을 나열하는 데 익숙합니다(재미있죠?).그 이유는 내가 최근에 어떤 파일을 변경했는지(또는 다른 사람이) 변경했는지 확인하고 싶기 때문입니다.

Git은 브랜치를 전환할 때 로컬 저장소가 (증분 저장소)에서 추적된 파일을 완전히 덮어쓰기 때문에 내 계획을 엉망으로 만들 것입니다.알아요...) 압축된 로컬 저장소에 있는 복사본입니다.

이렇게 하면 체크아웃된 모든 파일에 체크아웃 타임스탬프가 표시되고 마지막 수정 시간이 반영되지 않습니다....얼마나 짜증나는지.

그래서 저는 bash에서 모든 파일 내의 $Date:$ 속성을 업데이트하는 한 줄짜리 코드를 고안했습니다. 파일 시스템에 있는 내용에 따른 마지막 수정 시간 이를 통해 나는 git log , git show 또는 커밋 시간을 제공하는 다른 도구 탓하다 방법.

다음 절차에서는 $Date를 수정합니다.$ 키워드는 리포지토리에 커밋될 추적 파일에만 있습니다.그것은 사용한다 git diff --name-only 수정된 파일만 나열되며 그 외에는 아무것도 표시되지 않습니다....

나는 코드를 커밋하기 전에 이 한 줄짜리 코드를 수동으로 사용합니다.하지만 한 가지 점은 이것을 적용하기 전에 저장소의 루트 디렉터리로 이동해야 한다는 것입니다.

다음은 Linux용 코드 변형입니다(가독성을 위해 여러 줄로 붙여넣음).

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \
   set -- $l; f=$1;  shift; d=$*; modif=`date -d "@$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done

그리고 OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \
   set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top