CVS에서 Git으로 이동 : $ Id $ 상당? 코드 제어

간단한 소스 코드 제어 도구에 대해 묻는 많은 질문을 읽었으며 Git은 합리적인 선택처럼 보였습니다. 나는 그것을 실행하고 있으며 지금까지 잘 작동합니다. 내가 CVS에 대해 좋아하는 한 가지 측면은 버전 번호의 자동 증가입니다.

분산 저장소에서는 이것이 의미가 없다는 것을 이해하지만 개발자로서 나는 이와 같은 것을 원하거나 필요로합니다. 이유를 설명하겠습니다.

나는 Emacs를 사용합니다. 정기적으로 타사 패키지 용 Lisp 소스 파일의 새 버전을 살펴 봅니다. 헤더에 따르면 버전 1.3 인 foo.el 파일이 있다고 가정 해 보겠습니다. 최신 버전을 찾아 보면 1.143이나 2.6 또는 그 어떤 것이 든 내가 상당히 뒤쳐져 있다는 것을 압니다.

대신 40 자 해시 두 개가 표시되면 나중에 어떤 것이 있는지 알 수 없거나 얼마나 늦는 지 알 수 없습니다. 내가 얼마나 오래된 지 알기 위해 ChangeLogs를 수동으로 확인해야한다면 정말 싫어할 것입니다.

개발자로서 저는 제 결과물을 사용하는 사람들에게이 예의를 확장하고 싶습니다. 매번 직접 숫자를 늘리거나 타임 스탬프 또는 이와 비슷한 것을 증가시키는 것을 기억하고 싶지 않습니다. 그것은 실제 PITA이며 경험을 통해 알고 있습니다.

그래서 어떤 대안이 있습니까? $ Id : $에 해당하는 항목을 얻을 수없는 경우 원하는 정보를 어떻게 제공 할 수 있습니까?

내 기대는 최종 사용자가 Git을 설치하지 않고 설치하더라도 로컬 리포지토리를 갖지 않을 것이라는 것입니다.



답변

SHA는 버전의 하나의 표현 일뿐입니다 (표준이지만). 이 git describe명령은 다른 사람들을 제공하고 매우 잘 수행합니다.

예를 들어 Java memcached 클라이언트 소스 git describe의 마스터 브랜치에서 실행 하면 다음과 같은 결과가 나타납니다.

2.2-16-gc0cd61a

그것은 두 가지 중요한 것을 말합니다.

  1. 2.2 이후이 트리에는 정확히 16 개의 커밋이 있습니다.
  2. 정확한 소스 트리가 누구 다른 사람의 복제에 표시 할 수 있습니다.

예를 들어, version해당 번호를 표시하기 위해 소스와 함께 파일 을 패키징했다고 가정 해 보겠습니다 (또는 배포를 위해 모든 콘텐츠를 다시 작성). 패키지 버전이 2.2-12-g6c4ae7a(릴리스가 아니라 유효한 버전) 이라고 가정 해 보겠습니다 .

이제 정확히 얼마나 멀리 당신이 (4 커밋가) 있습니다 뒤에 볼 수 있습니다, 그리고 정확히하는 4 커밋을 볼 수 있습니다 :

# The RHS of the .. can be origin/master or empty, or whatever you want.
% git log --pretty=format:"%h %an %s" 2.2-12-g6c4ae7a..2.2-16-gc0cd61a
c0cd61a Dustin Sallings More tries to get a timeout.
8c489ff Dustin Sallings Made the timeout test run on every protocol on every bui
fb326d5 Dustin Sallings Added a test for bug 35.
fba04e9 Valeri Felberg Support passing an expiration date into CAS operations.

답변

지금까지 Git에서 $ Id : $를 지원합니다. 파일 README에 대해 활성화하려면 “README ident”를 .gitattributes에습니다 . 파일 이름에 와일드 카드가 지원됩니다. 자세한 내용은 man gitattributes 를 참조하십시오.


답변

이것은 OP의 부당한 요청이 아닙니다.

내 사용 사례는 다음과 같습니다.

  1. 나는 내 개인 코드에 Git을 사용하므로 다른 사람과 협력하지 않습니다.
  2. /usr/local/bin준비가되었을 때 들어갈 수있는 시스템 Bash 스크립트를 거기에 보관합니다 .

동일한 Git 저장소가있는 세 개의 개별 컴퓨터를 사용합니다. /usr/local/bin수동 “diff -u <repo version> <version in / usr / local / bin>”을 수행하지 않고도 현재 파일의 “버전”을 아는 것이 좋습니다 .

부정적인 사람들에게는 다른 사용 사례가 있다는 것을 기억하십시오. 모든 사람이 Git 저장소의 파일이 “최종”위치 인 공동 작업에 Git을 사용하는 것은 아닙니다.

어쨌든, 내가 한 방법은 다음과 같이 저장소에 속성 파일을 만드는 것입니다.

cat .git/info/attributes
# see man gitattributes
*.sh ident
*.pl ident
*.cgi ident

그런 다음 파일 어딘가에 $ Id $를 넣습니다 (나는 shebang 뒤에 넣는 것을 좋아합니다).

커밋. 예상대로 확장이 자동으로 수행되지는 않습니다. 예를 들어, 파일을 다시 복사해야합니다.

git commit foo.sh
rm foo.sh
git co foo.sh

그러면 확장이 표시됩니다. 예를 들면 다음과 같습니다.

$ head foo.sh
#!/bin/sh

# $Id: e184834e6757aac77fd0f71344934b1cd774e6d4 $

좋은 정보는 Git 저장소에 대한 ident 문자열을 어떻게 활성화합니까?에 있습니다. .


답변

이것이 Git에 있을지 확실하지 않습니다. Linus인용 하려면 :

“키워드 대체에 대한 전체 개념은 완전히 멍청합니다. 릴리스 트리를 타르볼 등으로 사용하려면 실제 콘텐츠 추적을”외부 “에서 수행하는 것은 사소한 일입니다.”

로그를 확인하는 것은 매우 쉽습니다. foo.el의 stable 브랜치를 추적하는 경우 로컬 복사본에없는 stable 브랜치의 로그에 어떤 새로운 커밋이 있는지 확인할 수 있습니다. CVS의 내부 버전 번호를 시뮬레이션하려는 경우 마지막 커밋의 타임 스탬프를 비교할 수 있습니다.

편집 :이를 위해 다른 사람의 스크립트를 작성하거나 사용해야합니다. 물론 수동으로 수행하지 마십시오.


답변

내가 작성한으로 하기 전에 :

모든 사람의 개발 라인이 다른 모든 라인과 다를 수 있기 때문에 Bazaar와 같은 DSCM 도구로는 적절한 버전 번호를 표시하는 자동 생성 Id 태그를 사용할 수 없습니다. 따라서 누군가가 파일의 버전 “1.41”을 참조 할 수 있지만 해당 파일의 버전 “1.41”이 다릅니다.

기본적으로 $ Id $는 Bazaar, Git 및 기타 분산 소스 코드 관리 도구에서 의미가 없습니다.


답변

나는 같은 문제가 있었다. 해시 문자열보다 간단하고 저장소에 연결할 필요없이 도구를 사용하는 사람들이 사용할 수있는 버전이 필요했습니다.

나는 Git 사전 커밋 후크를 사용하여 자동으로 업데이트 할 수 있도록 스크립트를 변경했습니다.

나는 커밋 횟수를 기반으로 버전을 결정합니다. 두 사람이 동시에 커밋 할 수 있고 둘 다 동일한 버전 번호를 커밋하고 있다고 생각하기 때문에 약간의 경쟁 조건입니다.하지만이 프로젝트에 개발자가 많지 않습니다.

예를 들어, Ruby에있는 스크립트를 확인하고 여기에이 코드를 추가합니다. 매우 간단한 코드이므로 다른 언어로 확인하는 경우 다른 언어로 쉽게 이식 할 수 있습니다 (분명히 이것은 텍스트 파일과 같은 실행 불가능한 체크 인에서는 쉽게 작동하지 않습니다.) 나는 추가했다 :

MYVERSION = '1.090'
## Call script to do updateVersion from .git/hooks/pre-commit
def updateVersion
  # We add 1 because the next commit is probably one more - though this is a race
  commits = %x[git log #{$0} | grep '^commit ' | wc -l].to_i + 1
  vers = "1.%0.3d" % commits

  t = File.read($0)
  t.gsub!(/^MYVERSION = '(.*)'$/, "MYVERSION = '#{vers}'")
  bak = $0+'.bak'
  File.open(bak,'w') { |f| f.puts t }
  perm = File.stat($0).mode & 0xfff
  File.rename(bak,$0)
  File.chmod(perm,$0)
  exit
end

그런 다음 스크립트에 명령 줄 옵션 (-updateVersion)을 추가하여 “tool -updateVersion”이라고 부르면 “MYVERSION”값 자체를 수정하는 도구에 대해 updateVersion을 호출 한 다음 종료합니다. 원하는 경우 다른 파일도 열리면 업데이트하십시오).

설정이 완료되면 Git 헤드로 이동하여 실행 가능한 한 줄 bash 스크립트를 .git/hooks/pre-commit.

스크립트는 단순히 Git 디렉토리의 헤드로 변경되고 내 스크립트를 -updateVersion.

-updateVersion으로 스크립트를 실행하는 사전 커밋 스크립트를 체크인 할 때마다 커밋 수에 따라 MYVERSION 변수가 업데이트됩니다. 마법!