각 지점과 마지막 개정 날짜를 Git에 나열


138

원격 저장소에서 이전 및 유지 관리되지 않은 분기를 삭제해야합니다. 마지막 수정 날짜별로 원격 지점을 나열하는 방법을 찾으려고하는데 할 수 없습니다.

이 방법으로 원격 브랜치를 나열하는 쉬운 방법이 있습니까?



3
에 대한 답변 : stackoverflow.com/questions/5188320/...는 모두 더 나은 대답을 여기보다
소프트웨어 엔지니어

답변:


172

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컴퓨터로 읽을 수있는 형식으로 원격 지사 이름을 가져 오려면 전환하십시오.

1
@hansen j : 흥미롭지 않나요? 스택 오버플로 ( codeinthehole.com/archives/… ) 가 공개 된 후 몇 개월이 지나서 다소 영감을 받았습니다. 더 많은 git commandlinefu에 대해서는 commandlinefu.com/commands/tagged/67/git 도 참조하십시오 .)
VonC

이 답변은 stackoverflow.com/questions/5188320/… 의 엉덩이를 차 버립니다. :)
Spundun

@SebastianG 확실하지 않습니다 : 그것은 그 자체로 좋은 질문 일 것입니다.
VonC

+1 commandlinefu.com URL /json끝에 추가 할 수있는 방법이 대단하고 모든 명령을 JSON으로 가져옵니다.
노아 서스 먼

1
@tripleee 감사합니다. 답변을 수정하고 더 많은 공개를 위해 귀하의 의견을 포함 시켰습니다.
VonC

121

내가 사용하는 것은 다음과 같습니다.

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"을 호출 할 수 있습니다.


5
for-each-ref 및 형식 옵션을 잘 사용합니다. +1. 내 대답에서 참조하는 명령보다 쉽게 ​​들립니다.
VonC

2
약간 조정 : ------- git for-each-ref --sort = '-authordate : iso8601'--format = '% (authordate : relative) % 09 % (refname : short)'refs / heads ------- 당신에게 상대 날짜를 제공하고 심판 / 머리를 제거
n8tr

1
그것이 분명하지 않은 사람들에게는 이것이 정보를 보여주는 것이라고 생각합니다. 현지 지점에만 적용됩니다.
hBrent

@ hBrent 당신이 맞아요, 그것은 정확히 질문에 대답하지 않았습니다. 그에 따라 답변을 편집했습니다.
ocroquette

이것은 분기를 정렬하고 나열합니다 authordate(분기가 처음 생성되었을 때 나타남). 로 변경 authordate하면 committerdate각 지점에서 가장 최근의 커밋 날짜가 표시됩니다. git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
Logan Besecker

23

의 오프 구축 올리비에 크로켓 상대 날짜를 사용하여이 같은 분기의 이름을 단축처럼 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

20

@VonC의 코멘트에 추가하려면 선호하는 솔루션을 사용하여 편의를 위해 ~ / .gitconfig 별칭 목록에 추가하십시오.

[alias]  
    branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'

그런 다음 간단한 "git branchdate"가 목록을 인쇄합니다.


3
.gitconfig와 함께 사용하는 방법을 보여주는 +1! 또한 fwiw는 형식 문자열을 다음 --format='%(authordate)%09%(objectname:short)%09%(refname)'과 같이 변경했습니다 . 각 분기의 짧은 해시도 가져옵니다.
노아 서스 먼

좋은. 마지막에 "| tac"를 추가하여 역순으로 정렬하여 최근에 터치 한 분기를 빠르게 볼 수 있습니다.
Ben

1
당신은 할 필요가 없습니다 | tac만, --sort='authordate'대신-authordate
크리스티안

4

이것을 검토 한 후에 생각해 낸 내용은 다음과 같습니다 .

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 --mergedgit branch --no-merged지점을 쉽게 삭제 할 수있는 식별하는 데 유용하다.

[ https://git-scm.com/docs/git-branch]


3

정렬 된 원격 브랜치 및 각 브랜치의 마지막 커밋 날짜

for branch in `git branch -r | grep -v HEAD`;do echo -e `git show --format="%ci %cr" $branch | head -n 1` \\t$branch; done | sort -r

1
리모컨에 관한 OP 질문에 대한 답변을 주셔서 감사합니다.
arcseldon

1

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 "|"

이것은 *현재 분기를 키워드로 표시하는 것을 키워드로 바꾸고 루프 본문에서 키워드를 볼 때 대신 플래그를 설정하고 아무것도 출력하지 않습니다. 플래그는 다음 행에 대체 형식을 사용해야 함을 나타내는 데 사용됩니다. 내가 말했듯이, 그것은 완전히 해키이지만 작동합니다! (아마도, 어떤 이유로 내 마지막 열이 현재 분기 선보다 뛰어납니다.)


불행히도 VonC의 답변 정보는 스크립팅의 훌륭한 기초가 아닙니다. 여기를 참조하십시오 git-blame.blogspot.com/2013/06/…
Andrew C

흠. 현재 브랜치의 이름이 있다면 이름을 얻는 방법을 보여줍니다. 기계 친화적 인 분기 목록을 얻는 [선호] 방법이 있습니까? (그리고 어떤 방법 "이 HEAD와 같은 심판인가?"직접 또는 어떻게 든 자식 요청을 통해 그 출력에서 하나, 현재 분기를 구별)
benkc

git for-each-ref스크립트 친화적 인 브랜치 처리 방법입니다. 현재 분기를 얻으려면 symbolic-ref를 한 번 실행해야합니다.
Andrew C

노력에 +1했지만, 그것은 실제로 나의 오래된 대답이었습니다. stackoverflow.com/a/16971547/6309 또는 (보다 완전한) stackoverflow.com/a/19585361/6309 는 더 적은 'sed'를 포함 할 수 있습니다.
VonC

1

간단한 별칭을 사용했는데 이것이 정확히 무엇인지 확실하지는 않지만 간단합니다.

로컬 지사뿐만 아니라 모든 지사를 나열하고 싶었으므로 위의 명령 만 수행했습니다.

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

도움이 되었으면 알려주세요.


좋고 간단합니다. 특별한 소스가 없습니다.
MrMas

0

또는 내 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++;
    }
?>

0

다음은 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
}

0

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}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.