깃 분기를 보관하려면 어떻게 해야 합니까?
Git 저장소에 더 이상 활성화되지 않은 오래된 분기가 있습니다.▁running▁▁i를 실행할 때 기본적으로 표시되지 않도록 하고 싶습니다.git branch -l -r기록을 유지하고 싶기 때문에 삭제하고 싶지 않습니다.어떻게 해야 하나요?
ref/heads 할 수 .를 들면, 들면를예,refs/archive/old_branch그렇게 하면 어떤 결과가 있습니까?
이를 위한 적절한 방법은 지점에 태그를 붙이는 것이라고 생각합니다.태그를 지정한 후 분기를 삭제하면 분기를 효과적으로 유지할 수 있지만 분기 목록이 복잡해지지는 않습니다.
지점으로 돌아가려면 태그를 확인하십시오.태그에서 분기를 효과적으로 복원합니다.
분기를 보관하고 삭제하는 방법
git tag archive/<branchname> <branchname>
git branch -d <branchname>
잠시 후 분기를 복원하려면 다음과 같이 하십시오.
git checkout -b <branchname> archive/<branchname>
분기 기록은 태그를 지정했을 때와 동일하게 유지됩니다.
제레미의 대답은 원칙적으로 옳지만, IMHO는 그가 지정한 명령이 완전히 옳지 않습니다.
다음은 분기를 체크아웃하지 않고 태그에 분기를 보관하는 방법입니다(따라서 분기를 삭제하기 전에 다른 분기로 체크아웃할 필요가 없습니다).
> git tag archive/<branchname> <branchname>
> git branch -D <branchname>
분기를 복원하는 방법은 다음과 같습니다.
> git checkout -b <branchname> archive/<branchname>
리모컨의 변화를 반영하기 위해 스티브의 대답을 확장하면서, 나는 했습니다.
git tag archive/<branchname> <branchname>
git branch -D <branchname>
git branch -d -r origin/<branchname>
git push --tags
git push origin :<branchname>
원격에서 복원하려면 이 질문을 참조하십시오.
예, 예를 사용하여 일부 비표준 접두사로 참조를 만들 수 있습니다.
- 를 보관합니다.
git update-ref refs/archive/old-topic topic && git branch -D topic - 분기 복원(필요한 경우):
git branch topic refs/archive/old-topic
접두사를 (여기서 " 비접여사는참조하용기를사두준표여(참)조▁ref▁(기")refs/archive평소에는 나타나지 않습니다.git branch,git log도 아니다git tag그래도 에 목록을 표시할 수 있습니다.
다음 별칭을 사용합니다.
[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개월(또는 리필로그가 없는 2주) 후에 GC가 됩니다.git gc --prune심판이 가리키는 커밋은 GC로부터 안전합니다.
편집: @ap에서 동일한 아이디어의 Perl 구현을 찾았습니다.
Edit^2: Gitster 자신이 같은 기술을 사용하는 블로그 게시물을 찾았습니다.그가 이름을 지었습니다.git hold.
다른 리포지토리에 분기를 보관할 수 있습니다.우아하진 않지만 실행 가능한 대안이라고 생각합니다.
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모든 분기를 표시합니다. 여기에는 "임의" 분기가 포함됩니다.
분기를 보관하지 않습니다.다른 말로 하면, 지점 자체가 보관됩니다.당신이 원하는 것은 고고학자들과 관련된 정보가 신뢰할 수 있는 방법으로 발견될 수 있도록 하는 것입니다.일상적인 개발에 도움이 되고 작업을 완료하는 과정에 추가 단계를 추가하지 않는다는 점에서 신뢰할 수 있습니다.즉, 사람들이 분기를 완료하면 태그를 추가하는 것을 기억하지 못할 것이라고 생각합니다.
여기 고고학과 발전에 큰 도움이 될 두 가지 간단한 단계가 있습니다.
- 간단한 명명 규칙을 사용하여 각 작업 분기를 이슈 추적기의 관련 이슈와 연결합니다.
- 항상사를 합니다.
git merge --no-ff태스크 분기를 병합합니다. 하나의 커밋에 대해서만 병합 커밋 및 기록 버블을 사용할 수 있습니다.
그게 다야. 왜?왜냐하면 코드 고고학자로서, 저는 나뭇가지에서 어떤 작업이 이루어졌는지 알고 싶어하지 않기 때문입니다.훨씬 더 자주
그래서 비명을 지르는 아홉 개의 지옥에서 코드가 이렇게 쓰여진 거죠?!
코드를 바꿔야 하는데, 이상한 기능이 있어서 중요한 것을 깨지 않기 위해 퍼즐을 맞춰야 합니다.
는 다음단는입니다.git blame연결된 커밋을 찾은 다음 로그 메시지가 설명되기를 바랍니다.좀 더 깊이 파고들 필요가 있다면, 작업이 지점에서 이루어졌는지 알아보고 지점 전체(이슈 추적기의 주석과 함께)를 읽겠습니다.
git blame포인트가 커밋 XYZ입니다. Git 브력저우라이g(▁(저력▁g▁iit우▁up라,g▁browser▁open▁a▁g▁g▁git브it,k,it이x, GitX, GitX,git log --decorate --graph등), 커밋 XYZ를 찾아 확인...
AA - BB - CC - DD - EE - FF - GG - II ...
\ /
QQ - UU - XYZ - JJ - MM
저기 내 나뭇가지야!QQ, UU, XYZ, JJ 및 MM이 모두 동일한 지점에 속해 있다는 것을 알고 있으므로 자세한 내용은 로그 메시지를 참조해야 합니다.나는 GG가 병합 커밋이 될 것이라는 것을 알고 있으며 추적기의 문제와 관련된 지점의 이름을 가지고 있기를 바랍니다.
어떤 이유에서인지 운영할 수 있는 오래된 지점을 찾고 싶다면,git log병합 커밋에서 분기 이름을 검색합니다.매우 큰 저장소에서도 충분히 빠릅니다.
그것이 제가 지점들이 스스로 보관한다고 말할 때 의미하는 것입니다.
모든 분기에 태그를 지정하면 작업을 완료하는 데 불필요한 작업이 추가되고(무자비하게 간소화되어야 하는 중요한 프로세스), 태그 목록(성능은 말할 것도 없지만 인간의 가독성)이 매우 가끔만 유용하고 고고학에도 매우 유용하지 않은 수백 개의 태그로 구성됩니다.
때때로 다음과 같이 분기를 보관합니다.
- 패치 파일 생성(예:
format-patch <branchName> <firstHash>^..<lastHash>(사용하여 먼저 해시 가져오기 및 마지막 해시 가져오기git log <branchName>. - 생성된 패치 파일을 파일 서버의 디렉터리로 이동합니다.
- 분기를 삭제합니다(예:
git branch -D <branchName>
분기를 다시 사용해야 할 때 패치를 "적용"하지만 패치 파일은 적용합니다( 참조).git am분기의 수 .는 대상 분기의 상태에 따라 어려울 수 있습니다.이러한 접근 방식을 사용하면 지점의 커밋을 가비지 수집할 수 있고 저장소의 공간을 절약할 수 있습니다.
0단계. 작업이 손실되지 않도록 작업 트리가 깨끗한지 확인합니다.
git status
1단계. 로컬 리포지토리의 루트에서 분기를 체크아웃한 다음 보관할 태그를 지정합니다.
git checkout <branch_name> && git tag archive/<branch_name>
2단계. 태그를 원격으로 업로드하고 계속하기 전에 다른 분기에 있는지 확인합니다(예:main:
git push origin --tags && git checkout main
3단계. 로컬 및 원격 리포지토리에서 분기를 삭제합니다.
git branch -D <branch_name> && git push origin -d <branch_name>
대해야할위치체를 대체해야 <branch_name>, 그리고 브이과름함께분할의기아카이.origin이 아닌 원격 합니다.origin.
댓글:
1단계 전후에 실행할 수 있습니다.
git tag추가된 태그를 확인합니다.3단계 이전과 이후에 시청할 수 있습니다.
https://github.com/<github-username>/<github-repository-name>/branches및 를 합니다.git branch -a분기가 삭제된 방법을 확인합니다.분기를 복원하는 방법
git checkout -b <branch_name> archive/<branch_name>
다음에
git push --set-upstream origin <branch_name>
참조:
https://gist.github.com/zkiraly/://gist.github.com/zkiraly/c378a1a43d8be9c9a8f9
https://dev.to/clsource/://dev.to/clsource/archiving-git-branches-3k70
제 접근 방식은 "trash_" 접두사를 사용하여 상관 없는 모든 분기의 이름을 바꾼 후 다음을 사용하는 것입니다.
git branch | grep -v trash
(셸 키 바인딩 포함)
활성 분기의 색상을 유지하려면 다음이 필요합니다.
git branch --color=always | grep --color=never --invert-match trash
Gita에서 분기는 일부 커밋에 대한 포인터일 뿐입니다.따라서 분기를 제거하면 포인터만 제거되고 분기가 병합되지 않은 경우에도 관련 코드는 제거되지 않습니다.따라서 로컬 분기를 "보관"하는 것은 포인터 이름(커밋 해시)을 기억하는 것만큼 간단합니다.는 이정는에수있다니습에서 수 ../git/refs/heads디렉토리입니다.또는 다음과 같은 분기 대 커밋 맵을 텍스트 파일로 복사하기만 하면 됩니다.
git branch -v > /path/to/backup/branches.txt
분기가 제거되면 다음 명령을 사용하여 로컬로 복원할 수 있습니다.
git branch <branch_name> <commit_hash>
분기를 보관하는 스크립트를 사용할 수 있습니다.
접두사 보관 파일로 태그를 만든 다음/ 분기를 삭제합니다.사용하기 전에 기능을 이해해야 합니다 =)
- 용도 -$/your/location/of/script/archbranch [branchname] [defaultbranch]
스크립트에 위치를 쓰지 않고 스크립트를 실행하려면 해당 스크립트를 경로에 추가합니다.
그럼 다음으로 전화하시면 됩니다.
$ archbranch [branchname] [defaultbranch]
그[defaultbranch]보관이 완료될 때 이동할 분기입니다.컬러 코딩에 문제가 있지만 작동하는 것 외에는 문제가 있습니다.저는 그것을 오랫동안 프로젝트에 사용해 왔습니다.
n개월 또는 년보다 오래된 분기를 아카이브하려면 이 bash 스크립트를 실행합니다.
#!/bin/bash
# Average days in a month - 30.436875
# Hours in a day 24
# Minutes in an hour 60
# Seconds in a minute 60
months_in_year=12
days_in_month=30.436875
hours_in_day=24
minutes_in_hour=60
seconds_in_minute=60
# Input is x months or x years
# $1 an integer
# $2 a time metric
# Name of the script, follows through simlinks
script_name="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
if [ $# -le 1 ]; then
echo "Usage: ./${script_name} [1-9] [month(s)/year(s)]"
exit 1
fi
time_period=$1
time_metric=$2
if [[ ${time_metric} =~ "month" ]]; then minimum_branch_age_in_seconds=$( echo "scale=4; $time_period * $days_in_month * $hours_in_day * $minutes_in_hour * $seconds_in_minute" | bc); fi
if [[ ${time_metric} =~ "year" ]]; then minimum_branch_age_in_seconds=$( echo "scale=4; $time_period * $months_in_year * $days_in_month * $hours_in_day * $minutes_in_hour * $seconds_in_minute" | bc); fi
echo "minimum_branch_age: $1 $2"
echo "minimum_branch_age_in_seconds: ${minimum_branch_age_in_seconds%.*}"
git for-each-ref refs/remotes | while read commit type ref;do
current=$(date +%s)
headcd=$(git log -1 --pretty=%cd --date=format:%s ${commit})
age_in_seconds=$((current-headcd))
if [[ ${age_in_seconds} -ge ${minimum_branch_age_in_seconds%.*} ]];then
branch=$(echo $ref | sed 's=refs/remotes/origin/==g')
age_in_months=$( echo "scale=4; $age_in_seconds / $days_in_month / $hours_in_day / $minutes_in_hour / $seconds_in_minute" | bc)
echo "archiving $branch - age in seconds - $age_in_seconds - age in months - $age_in_months "
git tag archive/${branch} ${branch}
git push -d origin ${branch}
git branch -D ${branch}
echo "Unarchive with: git checkout -b ${branch} archive/${branch}"
fi
done
이 스튜에 고기를 넣어준 제레미에게 감사합니다.
언급URL : https://stackoverflow.com/questions/1307114/how-can-i-archive-git-branches
'programing' 카테고리의 다른 글
| 여러 조건에 따라 데이터 프레임을 부분 집합화 (0) | 2023.06.06 |
|---|---|
| 파이어베이스에서 SQL "LIKE" 작업을 수행하는 방법은 무엇입니까? (0) | 2023.06.06 |
| VB/VB.NET 코드 주석 차단 (0) | 2023.06.01 |
| Html.Partial vs Html.부분 & Html을 렌더링합니다.액션 대 HTML.렌더 작업 (0) | 2023.06.01 |
| jQuery를 사용하여 드롭다운 항목의 선택된 값 가져오기 (0) | 2023.06.01 |