Gitに各ブランチとその最終リビジョンの日付をリストする


138

メンテナンスされていない古いブランチをリモートリポジトリから削除する必要があります。私は、リモートブランチを最後に変更された日付でリストする方法を見つけようとしていますが、できません。

この方法でリモートブランチを一覧表示する簡単な方法はありますか?



3
答え:stackoverflow.com/questions/5188320/…はここでの答えよりも優れています
ソフトウェアエンジニア、

回答:


172

commandlinefuには2つの興味深い命題があります。

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

これは、Unix構文のローカルブランチ用です。を使用すると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 Forrestコメントで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 

kontinuityコメントに追加します

追加したい場合は、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`


1
@hansen j:面白いですね。Stack Overflow(codeinthehole.com/archives/…)の公開リリースから数か月後にリリースされ、SOに触発されました。git commandlinefuの詳細については、commandlinefu.com
commands / tagged / 67

この答えは、stackoverflow.com / questions / 5188320 /…のお尻を蹴ります。:)
Spundun 2013年

@SebastianGはわかりません:それはそれ自体の良い質問でしょう。
VonC 2013年

+1 commandlinefu.comの URLの/json最後に追加すると、すべてのコマンドをJSONとして取得することができます。
Noah Sussman 2013

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、2014年

2
少し調整:------- git for-each-ref --sort = '-authordate:iso8601' --format = '%(authordate:relative)%09%(refname:short)' refs / heads -------相対日付を示し、参照/
見出し

1
すぐにはわからない人にとっては、これは情報を示していると思います。厳密には地元の支店向けです。
hBrent 2016

@hBrentあなたは正しい、それは正確に質問に答えませんでした。私はそれに応じて私の答えを編集しました。
オコケット

これにより、ブランチがソートおよびリストされますauthordate(ブランチが最初に作成されたときのように見えますか?)。あなたが変更した場合authordatecommitterdate、あなたは、最新の日付が各ブランチにコミット表示されます。このように:git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
ローガンベセッカー2017

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
+1を.gitconfigで使用する方法を示す!また、フォーマット文字列を次のように変更しました:--format='%(authordate)%09%(objectname:short)%09%(refname)'各ブランチの短いハッシュも取得します。
Noah Sussman 2013

いいね。最後に「| tac」を追加して逆順に並べ替えると、最近タッチしたブランチがすぐに表示されます。
ベン

1
あなたに必要のない| tac、ただ--sort='authordate'の代わりに-authordate
Kristján

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チェックが同じに複数の分岐点にコミットした場合、重複を削除することです。(リモートにも存在するローカルブランチと同様)。

OP要求ごとに、そのノート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 2015

1

VonCの回答に基づいて、2つのバリエーションを作成しました

私の最初のバリアント:

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 "|"ます。(残りの出力で予期しないものである限り、セパレーターとして何でも使用できます。)

私の2番目のバリアントはかなりハックですが、ブランチコマンドのように、「これは現在使用しているブランチです」というインジケーターがまだあるものが本当に欲しかったです。

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

これにより*、現在のブランチをマークしているがキーワードに変わり、ループ本体がキーワードを見つけると、代わりにフラグを設定して何も出力しません。フラグは、次の行に代替フォーマットを使用する必要があることを示すために使用されます。私が言ったように、それは完全にハックですが、それはうまくいきます!(主に、なんらかの理由で、私の最後の列が現在の分岐線で字下げされています。)


残念ながら、VonCs回答の情報は、スクリプト作成の優れた基盤ではありません。ここを参照してくださいgit-blame.blogspot.com/2013/06/...
アンドリュー・C

うーん。これは、現在のブランチに名前がある場合に、その名前を取得する方法を示しています。ブランチのマシンフレンドリーなリストを取得するための[推奨される]方法はありますか?(直接その出力から、あるいは何か尋ねるgitのいずれかを介して、現在のブランチを区別するためにいくつかの方法は、「これはHEADと同じ参照です?」)
benkc

git for-each-refブランチを処理するスクリプトに適した方法です。現在のブランチを取得するには、symbolic-refを1回実行する必要があります。
Andrew C

努力の+1、しかしそれは確かに私の古い答えでした。stackoverflow.com/a/16971547/6309または(より完全な)stackoverflow.com/a/19585361/6309では、「sed」が少なくて済みます。
VonC 2014年

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

それが役に立ったかどうか試して私に知らせてください


素敵でシンプル。特別なソースはありません。
Mrs

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週間以上前のリモートのブランチを示してい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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.