원격 저장소에서 이전 및 유지 관리되지 않은 분기를 삭제해야합니다. 마지막 수정 날짜별로 원격 지점을 나열하는 방법을 찾으려고하는데 할 수 없습니다.
이 방법으로 원격 브랜치를 나열하는 쉬운 방법이 있습니까?
원격 저장소에서 이전 및 유지 관리되지 않은 분기를 삭제해야합니다. 마지막 수정 날짜별로 원격 지점을 나열하는 방법을 찾으려고하는데 할 수 없습니다.
이 방법으로 원격 브랜치를 나열하는 쉬운 방법이 있습니까?
답변:
commandlinefu 에는 두 가지 흥미로운 제안이 있습니다.
for k in `git branch | perl -pe s/^..//`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
또는:
for k in `git branch | sed s/^..//`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k --`\\t"$k";done | sort
그것은 유닉스 문법에서 로컬 브랜치를위한 것입니다. 사용git branch -r
원격 브랜치를 유사하게 표시 할 수 있습니다.
for k in `git branch -r | perl -pe 's/^..(.*?)( ->.*)?$/\1/'`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r
댓글에 마이클 포레스트 언급 zsh가 sed
표현을 위해 이스케이프가 필요하다는 .
for k in git branch | perl -pe s\/\^\.\.\/\/; do echo -e git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1\\t$k; done | sort -r
zshrc를 추가하려면 다음 이스케이프가 필요합니다.
alias gbage='for k in `git branch -r | perl -pe '\''s/^..(.*?)( ->.*)?$/\1/'\''`; do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1`\\t$k; done | sort -r'
여러 줄로 :
alias gbage='for k in `git branch -r | \
perl -pe '\''s/^..(.*?)( ->.*)?$/\1/'\''`; \
do echo -e `git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | \
head -n 1`\\t$k; done | sort -r'
참고 : n8tr 의 답변을 바탕으로, git for-each-ref refs/heads
청소기입니다. 그리고 더 빠릅니다 .
또한보십시오 " 이름 만 옵션 git branch --list
? "
더 일반적으로, 삼중주 는 주석에서 우리 를 상기 시킵니다 .
- 더
$(command substitution)
이상 사용되지 않는 백틱 구문보다 최신 구문을 선호 합니다.
(2014 년에 " 셸 프로그래밍 의 차이점 $(command)
과 `command`
쉘 프로그래밍 의 차이점은 무엇입니까 ? "으로 그 요점을 설명했습니다. )
- 로 줄을 읽지 마십시오
for
.git for-each-ref refs/remote
컴퓨터로 읽을 수있는 형식으로 원격 지사 이름을 가져 오려면 전환하십시오.
내가 사용하는 것은 다음과 같습니다.
git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
이것은 출력입니다.
2014-01-22 11:43:18 +0100 refs/heads/master
2014-01-22 11:43:18 +0100 refs/heads/a
2014-01-17 12:34:01 +0100 refs/heads/b
2014-01-14 15:58:33 +0100 refs/heads/maint
2013-12-11 14:20:06 +0100 refs/heads/d/e
2013-12-09 12:48:04 +0100 refs/heads/f
원격 지점의 경우 "refs / heads"대신 "refs / remotes"를 사용하십시오.
git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/remotes
n8tr의 답변을 바탕으로 지점의 마지막 저자에 관심이 있고 사용 가능한 "열"도구가있는 경우 다음을 사용할 수 있습니다.
git for-each-ref --sort='-committerdate:iso8601' --format='%(committerdate:relative)|%(refname:short)|%(committername)' refs/remotes/ | column -s '|' -t
어느 것이 당신에게 줄 것입니까?
21 minutes ago refs/remotes/a John Doe
6 hours ago refs/remotes/b Jane Doe
6 days ago refs/remotes/master John Doe
최신 정보를 얻기 전에 "git fetch --prune"을 호출 할 수 있습니다.
authordate
(분기가 처음 생성되었을 때 나타남). 로 변경 authordate
하면 committerdate
각 지점에서 가장 최근의 커밋 날짜가 표시됩니다. git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
의 오프 구축 올리비에 크로켓 상대 날짜를 사용하여이 같은 분기의 이름을 단축처럼 I를 :
git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads
어느 것이 당신에게 출력을 제공합니다 :
21 minutes ago nathan/a_recent_branch
6 hours ago master
27 hours ago nathan/some_other_branch
29 hours ago branch_c
6 days ago branch_d
즐겨 찾는 별칭을 모두 추가 한 다음 스크립트를 팀에 공유하기 위해 Bash 파일을 만드는 것이 좋습니다. 다음을 추가하는 예는 다음과 같습니다.
#!/bin/sh
git config --global alias.branches "!echo ' ------------------------------------------------------------' && git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/heads && echo ' ------------------------------------------------------------'"
그런 다음이 작업을 수행하여 형식이 좋고 정렬 된 로컬 분기 목록을 얻을 수 있습니다.
git branches
@VonC의 코멘트에 추가하려면 선호하는 솔루션을 사용하여 편의를 위해 ~ / .gitconfig 별칭 목록에 추가하십시오.
[alias]
branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'
그런 다음 간단한 "git branchdate"가 목록을 인쇄합니다.
--format='%(authordate)%09%(objectname:short)%09%(refname)'
과 같이 변경했습니다 . 각 분기의 짧은 해시도 가져옵니다.
| tac
만, --sort='authordate'
대신-authordate
이것을 검토 한 후에 생각해 낸 내용은 다음과 같습니다 .
for REF in $(git for-each-ref --sort=-committerdate --format="%(objectname)" \
refs/remotes refs/heads)
do
if [ "$PREV_REF" != "$REF" ]; then
PREV_REF=$REF
git log -n1 $REF --date=short \
--pretty=format:"%C(auto)%ad %h%d %s %C(yellow)[%an]%C(reset)"
fi
done
그만큼 PREV_REF
검사는 같은 둘 이상의 분기점 커밋 경우 중복을 제거하는 것입니다. (리모트에도 존재하는 로컬 브랜치에서와 같이)
영업 요청에 따라,주의 git branch --merged
및 git branch --no-merged
지점을 쉽게 삭제 할 수있는 식별하는 데 유용하다.
VonC의 답변을 기반으로 두 가지 변형을 만들었습니다 .
내 첫 번째 변형 :
for k in `git branch -a | sed -e s/^..// -e 's/(detached from .*)/HEAD/'`; do echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset$k |%s" $k --`;done | sort | column -t -s "|"
로컬 및 원격 브랜치 ( -a
)를 처리하고 분리 된 헤드 상태 (더 긴 sed 명령을 처리하지만 솔루션은 조잡하지만 분리 된 브랜치 정보를 키워드 HEAD로 대체 함)를 처리하고 커밋 주제를 추가합니다 (% s ), 형식 문자열의 리터럴 파이프 문자를 통해 항목을 열에 넣고 최종 결과를에 전달합니다 column -t -s "|"
. (출력의 나머지 부분에서 예상하지 않는 한 구분 기호로 무엇이든 사용할 수 있습니다.)
내 두 번째 변형은 매우 해킹 적이지만 branch 명령과 같이 여전히 "현재있는 지점입니다"라는 표시가있는 것을 원했습니다.
CURRENT_BRANCH=0
for k in `git branch -a | sed -e 's/\*/CURRENT_BRANCH_MARKER/' -e 's/(detached from .*)/HEAD/'`
do
if [ "$k" == 'CURRENT_BRANCH_MARKER' ]; then
# Set flag, skip output
CURRENT_BRANCH=1
elif [ $CURRENT_BRANCH == 0 ]; then
echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset$k |%s" $k --`
else
echo -e `git log -1 --pretty=format:"%Cgreen%ci |%Cblue%cr |%Creset* %Cgreen$k%Creset |%s" $k --`
CURRENT_BRANCH=0
fi
done | sort | column -t -s "|"
이것은 *
현재 분기를 키워드로 표시하는 것을 키워드로 바꾸고 루프 본문에서 키워드를 볼 때 대신 플래그를 설정하고 아무것도 출력하지 않습니다. 플래그는 다음 행에 대체 형식을 사용해야 함을 나타내는 데 사용됩니다. 내가 말했듯이, 그것은 완전히 해키이지만 작동합니다! (아마도, 어떤 이유로 내 마지막 열이 현재 분기 선보다 뛰어납니다.)
git for-each-ref
스크립트 친화적 인 브랜치 처리 방법입니다. 현재 분기를 얻으려면 symbolic-ref를 한 번 실행해야합니다.
간단한 별칭을 사용했는데 이것이 정확히 무엇인지 확실하지는 않지만 간단합니다.
로컬 지사뿐만 아니라 모든 지사를 나열하고 싶었으므로 위의 명령 만 수행했습니다.
alias git_brs="git fetch && git branch -av --format='\''%(authordate)%09%(authordate:relative)%09%(refname)'\'"
당신은 위에 파이프 수 grep origin
원점 만 얻기 위해
여기에는 마지막으로 수정 된 날짜와 함께 모든 브랜치가 나열되며 최신 버전을 위해 어느 브랜치를 가져야하는지 결정하는 데 도움이
이로 인해 아래 유형의 디스플레이가 나타납니다.
Wed Feb 4 23:21:56 2019 +0230 8 days ago refs/heads/foo
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/heads/master
Mon Feb 9 12:19:33 2019 +0230 4 days ago refs/heads/bar
Wed Feb 11 16:34:00 2019 +0230 2 days ago refs/heads/xyz
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/HEAD
Mon Feb 9 12:19:33 2019 +0230 4 days ago refs/remotes/origin/foo
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/master
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/bar
Tue Feb 3 12:18:04 2019 +0230 10 days ago refs/remotes/origin/xyz
도움이 되었으면 알려주세요.
또는 내 PHP 스크립트 https://gist.github.com/2780984를 사용할 수 있습니다
#!/usr/bin/env php
<?php
$local = exec("git branch | xargs $1");
$lines = explode(" ", $local);
$limit = strtotime("-2 week");
$exclude = array("*", "master");
foreach ($exclude as $i) {
$k = array_search($i, $lines);
unset($lines[$k]);
}
$k = 0;
foreach ($lines as $line) {
$output[$k]['name'] = $line;
$output[$k]['time'] = exec('git log '.$line.' --pretty=format:"%at" -1');
if ($limit>$output[$k]['time']) {
echo "This branch should be deleted $line\n";
exec("git branch -d $line");
}
$k++;
}
?>
다음은 bash_profile에 추가하여 쉽게 수행 할 수있는 기능입니다.
Git 리포지토리에서의 사용법 :
branch
모든 현지 지점을 인쇄합니다branch -r
모든 원격 지점을 인쇄합니다함수:
branch() {
local pattern="s/^..//"
local arg=""
if [[ $@ == "-r" ]]; then
pattern="s/^..(.*?)( ->.*)?$/\1/"
arg=" -r "
echo '-r provided'
fi
for k in $(git branch $arg | perl -pe "$pattern"); do
echo -e $(git show --pretty=format:"%Cgreen%ci %Cblue%cr%Creset" $k -- | head -n 1)\\t$k
done | sort -r
}
PowerShell에서 다음은 원격으로 이미 병합되어 있고 2 주 이상 된 지점을 나타냅니다 (2 author:relative
주가 아닌 몇 주가 아닌 형식이 표시되기 시작 함).
$safeBranchRegex = "origin/(HEAD|master|develop)$";
$remoteMergedBranches = git branch --remote --merged | %{$_.trim()};
git for-each-ref --sort='authordate:iso8601' --format=' %(authordate:relative)%09%(refname:short)' refs/remotes | ?{$_ -match "(weeks|months|years) ago" -and $_ -notmatch "origin/(HEAD|master|qa/)"} | %{$_.substring($_.indexof("origin/"))} | ?{$_ -in $remoteMergedBranches}