로컬 및 원격 리포지토리를 항상 브랜치 측면에서 동기화하고 싶습니다.
GitHub에 대한 풀 요청 검토 후 분기를 병합하고 제거합니다 (원격). 로컬 리포지토리에서이 정보를 가져 와서 Git이 로컬 버전의 브랜치를 제거하도록하려면 어떻게해야합니까?
git ls-remote
하고 git show-ref
.
git symbolic-ref
와 git update-ref
.
로컬 및 원격 리포지토리를 항상 브랜치 측면에서 동기화하고 싶습니다.
GitHub에 대한 풀 요청 검토 후 분기를 병합하고 제거합니다 (원격). 로컬 리포지토리에서이 정보를 가져 와서 Git이 로컬 버전의 브랜치를 제거하도록하려면 어떻게해야합니까?
git ls-remote
하고 git show-ref
.
git symbolic-ref
와 git update-ref
.
답변:
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
주의 :에 있지 않으면 master
분기를 삭제할 가능성이 있습니다. "더 나은 방법"을 계속 읽으십시오.
당신을 확인 할 수 있습니다 master
, 또는 그 문제에 대한 다른 지점에 의해 제거되지 않는 grep
이상 보내고. 이 경우 당신은 갈 것입니다 :
git branch --merged | grep -v "\*" | grep -v "YOUR_BRANCH_TO_KEEP" | xargs -n 1 git branch -d
그래서 만약 우리가 유지하고 싶어 master
, develop
그리고 staging
예를 들어, 우리는 갈 것입니다 :
git branch --merged | grep -v "\*" | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d
약간 길기 때문에 .zshrc
또는에 별칭을 추가 할 수 있습니다 .bashrc
. 내 이름은 gbpurge
( git branches purge
)입니다.
alias gbpurge='git branch --merged | grep -Ev "(\*|master|develop|staging)" | xargs -n 1 git branch -d'
그런 다음 다시로드하여 .bashrc
나 .zshrc
:
. ~/.bashrc
또는
. ~/.zshrc
branch
A는 자기가 아닌 배관 명령 , 그것을 깰 수 망할 놈의 미래 버전의 모든 UI 변경에 대한 조심.
master
가 삭제됩니다.
grep -Ev '(\*|master|important-branch)'
~/.gitconfig
대신 넣으려면 다음을 [alias]
섹션에 추가 하십시오 : gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
(grep 표현식에서 ()을 사용할 필요가 없습니다).
나는 GitHub와 동일한 흐름을 사용하고 git branch --merged
병합 된 분기 목록으로 저를 만족시키는 이전 답변을 찾지 못했습니다 .하지만 모든 경우 원격으로 제거되지 않았습니다. 그래서 이것은 나를 위해 일했습니다 :
git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
어디:
git fetch --all -p
: 로컬 지점 상태 업데이트git branch -vv
: 현지 지사 상태 표시grep ": gone]"
: 삭제 된 필터awk '{ print $1 }'
: 그들의 이름을 추출xargs -n 1 git branch -d
: 이름을 삭제 명령에 전달참고 : 원하는 경우 -d 대신 -D를 사용하면 삭제가 적용됩니다.
예를 들면 다음과 같습니다.
someUsr@someHost:~/repo$ git branch -a
basic-testing
integration-for-tests
* master
origin
playground-for-tests
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services
someUsr@someHost:~/repo$ git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
Fetching origin
Deleted branch integration-for-tests (was fbc609a).
Deleted branch playground-for-tests (was 584b900).
someUsr@someHost:~/repo$ git branch -a
basic-testing
* master
origin
test-services
remotes/origin/HEAD -> origin/master
remotes/origin/basic-testing
remotes/origin/master
remotes/origin/test-services
참고:
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
대본과 설명, 감사합니다 :)
branch -vv
지점의 마지막 커밋 메시지 를 보여줍니다. 그 메시지에 "사라진"문제가 발생하면 grep gone
해당 지점에도 영향을 미칩니다. 따라서 grep ": gone]"
사용하기에 조금 더 안전 할 것입니다.
awk '$3 $4 ~ /:gone]$/ { print $1 }'
-D
대신에 필요한 것 외에도 -d
완벽한 답이 있습니다!
시험:
자식 풀-정리
해당 원격 지점이 삭제되면 로컬 지점을 삭제합니다.
위의 진술은 정확하지 않습니다.
실제로 달리기 git pull --prune
는 다음 과 같은 원격 추적 분기 만 제거합니다.
리모컨 / 원산지 / fff 리모컨 / 원산지 / 개발 리모컨 / 원산지 / 마스터
그런 다음 git branch -r
컴퓨터에 남아있는 원격 추적 분기를 확인하기 위해 실행할 수 있습니다 . 왼쪽 가지가 다음과 같다고 가정하십시오.
출발지 / 개발자 출발지 / 마스터
이는 지점 origin/fff
이 삭제 되었음을 의미합니다 .
따라서을 실행 한 후 다음을 실행하십시오 git pull --prune
.
git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
다음과 같은 모든 현지 지점을 찾을 수 있습니다.
그런 다음 <the command above> | xargs git branch -d
모두 삭제할 수 있습니다.
git fetch --prune
, 그것은 나의 선택입니다
git pull --prune
발생했습니다 . 명령 행에 분기를 지정해야합니다. "
이 중 어느 것도 나를 위해 일하지 않았습니다. https://stackoverflow.com/a/34969726/550454 에서 내 다른 대답을 볼 수 있습니다.
그러나 본질적으로, 나는 이제 이것을 내 안에 가지고 있습니다 ~/.gitconfig
:
[alias]
prune-branches = !git remote prune origin && git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -r git branch -d
매우 간단한 해결책 : 로컬 저장소를 제거하고 원격을 새로 복제하십시오. 매우 우아해 보이지는 않지만 간단하지만 매뉴얼 페이지를 읽지 않고 현재하고있는 것을 정확하게 이해할 수 있습니다 :-).
해당 원격 분기가없는 모든 로컬 분기를 나열하기 위해이 단일 라이너를 작성했습니다.
diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -
이 작업이 끝나면 다음과 같이 로컬 분기를 쉽게 삭제할 수 있습니다 xargs
.
diff -u <(git branch|sed 's/..//') <(git branch -r|sed 's/..origin\///')|tail -n +4|sed -n "s/^-//p" -|xargs -r git branch -d
master
있으며 예상대로 작동하지 않습니다. 조심
투표 된 답변은 마스터를 삭제할 가능성이 있습니다. 아래 실제 예를 구성하십시오.
나는 hemen_README와 hemen_BASEBOX의 두 가지 기능 분기를 개발에 병합 한 다음 개발을 마스터로 병합했습니다. hemen_README 및 hemen_BASEBOX 기능 분기는 원격으로 삭제되었지만 여전히 로컬로 표시되었습니다. 또한 나는 로컬 마스터가 아니지만 개발 중입니다.
이 경우
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop 671ad6c Merged in hemen_README (pull request #1)
hemen_BASEBOX a535c0f added global exec paths to puppet manifest
hemen_README ba87489 Updated Readme with considerable details
master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/hemen_BASEBOX a535c0f added global exec paths to puppet manifest
remotes/origin/hemen_README ba87489 Updated Readme with considerable details
remotes/origin/master 2f093ce Merged in develop (pull request #3)
따라서 위의 부분 명령을 실행하면
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch --merged | grep -v "\*"
hemen_BASEBOX
hemen_README
master
마스터도 표시되어 결국 삭제됩니다.
어쨌든 나는 그것을 할 수있었습니다. 내가 달성 한 방법에 대해 세션 로그를 공유하고 있습니다.
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin --dry-run
Pruning origin
URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
* [would prune] origin/hemen_BASEBOX
* [would prune] origin/hemen_README
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git remote prune origin
Pruning origin
URL: git@bitbucket.org:hemenkapadiapublic/vagrant-webdev.git
* [pruned] origin/hemen_BASEBOX
* [pruned] origin/hemen_README
방금 whay가 가지 치기를 한 다음 정리했습니다. 아래의 분기 명령을 살펴보면 리모컨을 관리했습니다.
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop 671ad6c Merged in hemen_README (pull request #1)
hemen_BASEBOX a535c0f added global exec paths to puppet manifest
hemen_README ba87489 Updated Readme with considerable details
master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/master 2f093ce Merged in develop (pull request #3)
이제 현지 지점을 삭제하십시오.
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_BASEBOX
Deleted branch hemen_BASEBOX (was a535c0f).
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -d hemen_README
Deleted branch hemen_README (was ba87489).
이제는 가지가 원하는대로 좋습니다.
hemen@hemen-MXC061:~/data/projects/vagrant-webdev$ git branch -v -a
* develop 671ad6c Merged in hemen_README (pull request #1)
master 8980894 [behind 7] Initial Vagrantfile, works for vagrant up. Also initial .gitignore
remotes/origin/develop 671ad6c Merged in hemen_README (pull request #1)
remotes/origin/master 2f093ce Merged in develop (pull request #3)