[git] 자식 분기를 어떻게 보관할 수 있습니까?

내 자식 저장소에 더 이상 활발히 개발되지 않은 오래된 지점이 있습니다. 실행시 기본적으로 표시되지 않도록 분기를 보관하고 싶습니다 git branch -l -r. 기록을 유지하고 싶기 때문에 삭제하고 싶지 않습니다. 어떻게해야합니까?

심판 / 헤드 이외의 심판을 만들 수 있다는 것을 알고 있습니다. 예를 들면 다음과 같습니다 refs/archive/old_branch. 그렇게하면 어떤 결과가 있습니까?



답변

이 작업을 수행하는 올바른 방법은 지점에 태그를 지정하는 것입니다. 태그를 지정한 후 분기를 삭제하면 분기를 효과적으로 유지하지만 분기 목록을 어지럽히 지 않습니다.

지점으로 돌아가려면 태그를 확인하십시오. 태그에서 분기를 효과적으로 복원합니다.

브랜치를 아카이브하고 삭제하려면 다음을 수행하십시오.

git tag archive/<branchname> <branchname>
git branch -d <branchname>

얼마 후 지점을 복원하려면 다음을 수행하십시오.

git checkout -b <branchname> archive/<branchname>

지점의 기록은 태그를 지정할 때와 동일하게 유지됩니다.


답변

Jeremy의 대답은 원칙적으로 맞지만 IMHO가 지정한 명령은 옳지 않습니다.

분기를 체크 아웃하지 않고 분기를 태그에 보관하는 방법은 다음과 같습니다 (따라서 해당 분기를 삭제하기 전에 다른 분기를 체크 아웃하지 않아도 됨).

> git tag archive/<branchname> <branchname>
> git branch -D <branchname>

분기를 복원하는 방법은 다음과 같습니다.

> git checkout -b <branchname> archive/<branchname>


답변

git update-ref.를 사용하여 비표준 접두사로 참조를 만들 수 있습니다 . 예 :

  • 지점을 보관하십시오. git update-ref refs/archive/old-topic topic && git branch -D topic
  • 분기를 복원하십시오 (필요한 경우). git branch topic refs/archive/old-topic

비표준 접두사 (여기서는 refs/archive)가있는 참조는 평소 git branch에 표시 git log되지 않습니다 git tag. 여전히을 (를) 함께 나열 할 수 있습니다 git for-each-ref.

다음 별칭을 사용하고 있습니다.

[alias]
    add-archive = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
    list-archive = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
    rem = !git add-archive
    lsrem = !git list-archive

또한 보관 된 분기를 자동으로 (또는 원샷으로) 푸시하는 것과 같이 리모컨구성 할 수도 있습니다 .push = +refs/archive/*:refs/archive/*git push origin refs/archive/*:refs/archive/*

다른 방법은 분기를 삭제하기 전에 어딘가에 SHA1을 기록하는 것이지만 한계가 있습니다. 어떤 심판이없는 커밋이 될 것입니다 3개월 (또는 reflog없이 몇 주) 후 GC’d 혼자 매뉴얼을 보자 git gc --prune. 심판이 지적한 커밋은 GC로부터 안전합니다.

편집 : @ap에 의해 동일한 아이디어의 perl 구현을 찾았 습니다 .git-attic

편집 ^ 2 : Gitster가 동일한 기술을 사용 하는 블로그 게시물을 찾았 습니다 .


답변

리모컨의 변경 사항을 반영하기 위해 Steve의 답변 을 확장했습니다.

 git tag archive/<branchname> <branchname>
 git branch -D <branchname>
 git branch -d -r origin/<branchname>
 git push --tags
 git push origin :<branchname>

리모컨에서 복원하려면 이 질문을 참조하십시오 .


답변

다른 저장소에 지점을 보관할 수 있습니다. 그다지 우아하지는 않지만 가능한 대안이라고 말하고 싶습니다.

git push git://yourthing.com/myproject-archive-branches.git yourbranch
git branch -d yourbranch


답변

이에 대한 별명은 다음과 같습니다.

arc    = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f"

다음과 같이 추가하십시오 :

git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f'

곰 염두에두고있다 git archive당신이 사용할 수 있도록 이미 명령 archive별칭 이름으로.

또한 ‘아카이브 된’브랜치 목록을 볼 수 있도록 별칭을 정의 할 수 있습니다.

arcl   = "! f() { git tag | grep '^archive/';}; f"

별명 추가 정보


답변

보관 된 분기를 숨기려면 다음 별칭을 사용하고 있습니다.

[alias]
    br = branch --no-merge master # show only branches not merged into master
    bra = branch                  # show all branches

따라서 git br적극적으로 개발 된 지점 git bra을 표시하고 “아카이브 된” 지점을 포함한 모든 지점을 표시 합니다.