web-dev-qa-db-ja.com

各ブランチとその最新リビジョンの日付をgitでリストする

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

この方法でリモートブランチをリストする簡単な方法を誰かが知っていますか?

127
Roni Yaniv

commandlinef には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'
161
VonC

私が使用するものは次のとおりです。

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

ブランチの最後の著者にも興味があり、「列」ツールを使用できる場合は、l8trの答えに基づいて、次を使用できます。

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」を呼び出すことをお勧めします。

103
ocroquette

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
20
n8tr

@VonCによってコメントに追加するために、希望するソリューションを選択して、〜/ .gitconfigエイリアスリストに追加してください。

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

次に、単純な「git branchdate」がリストを出力します...

19
yngve

this を確認した後、私が思いついたものを次に示します。

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]

4
go2null

ソート済みリモートブランチおよび各ブランチの最終コミット日。

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
3
shweta

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

これにより、現在のブランチをマークする*がキーワードに変わり、ループ本体がキーワードを検出すると、代わりにフラグを設定して何も出力しません。このフラグは、次の行に代替フォーマットを使用する必要があることを示すために使用されます。私が言ったように、完全にハッキーですが、動作します! (主に、何らかの理由で、私の最後のコラムは現在のブランチラインでアウトデントされています。しかし、これをさらに調整するのではなく、実際の作業に戻る必要があります。)

1
benkc

これを簡単にするために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
enderland

または、私の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

Powershellで、すでにマージされ、少なくとも2週間前のリモート上のブランチを表示します。 (作成者:相対形式では、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}
0
Dave Neeley