각 지점 및 해당 지점의 마지막 개정 날짜를 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 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/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
'programing' 카테고리의 다른 글
SQL 쿼리의 SELECT 문에서 WITH TIES 키워드는 무엇을 사용합니까? (0) | 2023.06.28 |
---|---|
Mongo 클라이언트가 밑줄이 앞에 붙은 컬렉션에 액세스할 수 없음 (0) | 2023.06.28 |
'{}' 유형을 '{title: string; }' 유형에 할당할 수 없습니다. (0) | 2023.06.28 |
Git 하위 모듈 이름 바꾸기 (0) | 2023.06.28 |
파이썬의 사이트 패키지 디렉터리는 무엇입니까? (0) | 2023.06.28 |