문제

현재 우리는 버전 제어를 위해 Perforce를 사용하고 있습니다. 그것은 빌드를 참조하는 데 사용할 수있는 엄격하게 증가하는 변경 숫자의 편리한 기능을 가지고 있습니다.

분산 시스템 (아마도 git)을 사용하여 분기하고 집에서 일할 수 있도록 전환하고 싶습니다. (둘 다 Perforce에서는 완벽하게 가능하지만 GIT 워크 플로에는 몇 가지 장점이 있습니다.) 따라서 "지류 개발"이 배포되고 일반적인 개정 시퀀싱을 언급하지는 않지만 모든 변경 사항이 여전히 마스터 Git Repo를 유지할 수 있습니다. 빌드가 생성되기 전에 공급해야합니다.

빌드 ID를 엄격하게 증가시키는 가장 좋은 방법은 무엇입니까? 내가 생각할 수있는 가장 간단한 방법은 마스터 레포가 업데이트 될 때마다 발사되는 일종의 사후 훅을 갖는 것입니다. 새로운 트리 객체 (또는 커밋 객체? git) 중앙 데이터베이스가있는 ID를 제공합니다. ( "데이터베이스"라고 말하지만 아마도 git 태그로 수행하고 다음에 사용 가능한 태그 번호 또는 무언가를 찾으십시오. 따라서 "데이터베이스"는 실제로 .git/refs/tags/build-id/입니다. )

이것은 실행 가능하지만,이를 달성하는 더 쉽거나 이미 구현 된 표준/"모범 사례"방법이 있는지 궁금합니다.

도움이 되었습니까?

해결책

나는 두 번째로 사용의 제안을한다 git describe. 제정신 버전 정책이 있고 저장소로 미친 짓을하지 않는다면. git describe 항상 단조로운 일 (최소한 수정 기록이 나무 대신 멍청한 경우)과 독특합니다.

약간의 데모 :

git init
git commit --allow-empty -m'Commit One.'
git tag -a -m'Tag One.' 1.2.3
git describe    # => 1.2.3
git commit --allow-empty -m'Commit Two.'
git describe    # => 1.2.3-1-gaac161d
git commit --allow-empty -m'Commit Three.'
git describe    # => 1.2.3-2-g462715d
git tag -a -m'Tag Two.' 2.0.0
git describe    # => 2.0.0

출력 git describe 다음 구성 요소로 구성됩니다.

  1. 당신이 설명하는 커밋에서 도달 할 수있는 최신 태그
  2. 커밋과 태그 사이의 커밋 수 (0이 아닌 경우)
  3. 커밋의 (약식) ID ( #2가 0이 아닌 경우)

#2는 출력을 단조롭게 만드는 이유입니다. #3은 그것을 독특하게 만드는 것입니다. #2와 #3은 커밋이 생략됩니다. ~이다 태그, 만들기 git describe 생산 릴리스에도 적합합니다.

다른 팁

현재 커밋에 해당하는 단조 적으로 증가하는 수는 다음과 같이 생성 될 수 있습니다.

git log --pretty=oneline | wc -l

단일 번호를 반환합니다. 또한 현재 SHA1을 해당 숫자에 추가하여 독창성을 추가 할 수 있습니다.

이 접근법은보다 낫습니다 git describe, 태그를 추가 할 필요가없고 자동으로 합병을 처리 할 필요가 없기 때문입니다.

재건에 문제가있을 수 있지만, 재건은 어쨌든 "위험한"작업입니다.

    git rev-list BRANCHNAME --count

이것은보다 훨씬 덜 집약적입니다

    git log --pretty=oneline | wc -l

git tag 필요한 것을 위해 충분할 수 있습니다. 모든 사람이 달리 사용하지 않는 것에 동의하는 태그 형식을 선택하십시오.

참고 : 로컬로 태그를 지정하면 a git push 서버의 태그를 업데이트하지 않습니다. 사용 git push --tags 그에 대한.

당신은 조사해야합니다 git describe. 그것은 최신 주석이 붙은 태그, 해당 태그 이후의 커밋 수 및 분기 헤드의 약식 커밋 ID를 설명하는 고유 한 문자열을 제공합니다.

아마도 당신은 제어 된 빌드 릴리스를 수행하는 단일 지점이있을 것입니다. 이 경우 알려진 태그 형식으로 조기 커밋을 태그 한 다음 알려진 태그와 관련하여 현재 헤드를 설명하기 위해 -매치 옵션과 함께 GIT 설명을 사용합니다. 그런 다음 GIT 설명 결과를 IS로 사용하거나 실제로 단일 숫자 만 원한다면 REGEX를 사용하여 태그에서 숫자를자를 수 있습니다.

지점을 다시 생각하지 않는다고 가정하면 다음 커밋의 수는 항상 지점의 역사상 고유 한 지점을 식별합니다.

EG (Bash 또는 이와 유사한 사용)

# make an annotated tag to an early build in the repository:
git tag -a build-origin "$some_old_commitid"

# describe the current HEAD against this tag and pull out a build number
expr "$(git describe --match build-origin)" : 'build-origin-\([0-9]*\)-g'

성공적으로 (또는 실패한) 빌드가있을 때마다 "라벨"을 사용하고 있으며, 그 빌드를 영원히 식별 할 수 있습니다. 그것은 동일하지는 않지만 분산 개발의 이점을 제공하면서도 빌드 숫자를 제공합니다.

아시다시피, GIT는 역사의 노드를 고유하게 식별하는 해시 (숫자)를 계산합니다. 이것들을 사용하면 엄격하게 증가하지는 않지만 충분히 좋을 것 같습니다. (더 나은 것입니다 언제나 소스에 해당하므로 해시가있는 경우 동일한 코드가 있습니다.) 숫자가 큽니다. 그러나 대부분 6 개 정도의 주요 숫자로 얻을 수 있습니다.

예를 들어,

그 버그는 064f2ea에서 고정되었습니다 ...

Mercurial을 사용하면 다음 명령을 사용할 수 있습니다.

# get the parents id, the local revision number and the tags
[yjost@myhost:~/my-repo]$ hg id -nibt
03b6399bc32b+ 23716+ default tip

보다 HG 식별

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top