programing

각 지점 및 해당 지점의 마지막 개정 날짜를 Git로 나열

stoneblock 2023. 6. 28. 21:17

각 지점 및 해당 지점의 마지막 개정 날짜를 Git로 나열

원격 저장소에서 오래된 지점과 유지 관리되지 않은 지점을 삭제해야 합니다.원격 지점을 마지막으로 수정한 날짜까지 나열할 방법을 찾고 있는데, 그럴 수 없습니다.

원격 지점을 이렇게 쉽게 나열할 수 있는 방법이 있습니까?

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 --color=always -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

Michael Forrester는 코멘트에서 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답변은 더 깨끗합니다.그리고 더 빨리.
"이름만 선택사항"을 참조하십시오.

일반적으로, 트리플리댓글에서 우리에게 상기시킵니다.

  • 현대적인 것을 선호합니다.$(command substitution)obsector backtick 구문에 대한 입니다.

(저는 2014년에 "셸 프로그래밍의 와 차이점은 무엇입니까?")

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

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/remote"를 사용합니다.

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에, 신최정얻기전에전를, 추기에하가또는보전을 추가합니다.%(color:<color>)일부 필드를 특정 색상으로 표시하는 형식의 문입니다.

Olivier Croquette를 바탕으로 상대적인 날짜를 사용하고 지점 이름을 다음과 같이 단축하는 것을 좋아합니다.

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 branch date"가 목록을 출력합니다.

원격 분기와 각 분기의 마지막 커밋 날짜를 정렬했습니다.

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

제가 이것도 검토한 후에 생각해낸 것은 다음과 같습니다.

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둘 이상의 분기가 동일한 커밋을 가리킬 경우 중복 항목을 제거합니다.(리모트에도 존재하는 로컬 분기와 마찬가지로)

참고로 OP 요청에 따라git branch --merged그리고.git branch --no-merged쉽게 삭제할 수 있는 분기를 식별하는 데 유용합니다.

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

나는 간단한 가명을 썼는데, 이것이 정확히 무엇을 묻는 것인지 확실하지 않지만, 그것은 간단합니다.

위의 명령이 수행하는 로컬 분기뿐만 아니라 모든 분기를 나열하고 싶어서 이 작업을 수행했습니다.

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

도움이 됐는지 알려주세요, 해피 기팅.

저는 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 "|"(나머지 출력에서 예상하지 못한 것이라면 구분 기호로 무엇이든 사용할 수 있습니다.)

저의 두 번째 변형은 꽤 까다롭지만, 저는 브랜치 명령이 하는 것처럼 "여기가 현재 당신이 있는 브랜치입니다"라는 표시가 있는 것을 정말 원했습니다.

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

이렇게 하면 다음과 같습니다.*현재 분기를 키워드로 표시하고, 루프 본문이 키워드를 볼 때 대신 플래그를 설정하고 아무것도 출력하지 않습니다.이 플래그는 다음 줄에 대체 형식을 사용해야 함을 나타내는 데 사용됩니다.내가 말했듯이, 그것은 완전히 구식이지만, 효과가 있습니다! (대부분입니다.)어떤 이유에서인지 마지막 열이 현재 분기선에서 움푹 패이고 있습니다.)

PowerShell에서 다음은 이미 병합되고 2주 이상 경과된 원격의 분기를 보여줍니다(The-Workshell).author:relative형식은 2주에서 일이 아닌 주를 표시하기 시작합니다):

$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}

VonC의 답변에서 영감을 얻어 개선(예: 원격 지사, Perl 회피, 교체)git show타고git log):

for k in $(git branch -a | sed -e 's/^..//' | grep -v -- '->'); \
    do echo -e $(git log -1 --pretty=format:"%ci %cr" $k) \
    \\t$k; done | sort -r

또는 제 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
}

언급URL : https://stackoverflow.com/questions/2514172/listing-each-branch-and-its-last-revisions-date-in-git