162

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

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

4

11 に答える 11

191

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

より一般的には、tripleeはコメントで私たちに思い出させます:

  • $(command substitution)廃止されたバッククォート構文よりも最新の構文を優先します。

(2014年に「シェルプログラミングシェルプログラミングの違いは何$(command)`command`ですか? 」でその点を説明しました)

于 2010-03-25T09:24:41.393 に答える
140

これが私が使用するものです:

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

最新の情報を入手するには、前に「gitfetch--prune」を呼び出すことをお勧めします。

于 2014-01-23T09:49:38.103 に答える
32

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
于 2014-05-29T22:20:40.673 に答える
21

@VonCによるコメントに追加するには、お好みのソリューションを使用して、便宜上〜/.gitconfigエイリアスリストに追加してください。

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

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

于 2013-02-27T16:58:43.087 に答える
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 --merged簡単git branch --no-mergedに削除できるブランチを特定するのに役立ちます。

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

于 2015-06-18T00:34:50.637 に答える
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
于 2015-06-01T13:19:48.380 に答える
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番目のバリアントはかなりハッキーですが、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 "|"

これにより*、現在のブランチをマークするがキーワードに変わり、ループ本体がキーワードを検出すると、代わりにフラグを設定して何も出力しません。このフラグは、次の行に別のフォーマットを使用する必要があることを示すために使用されます。私が言ったように、それは完全にハッキーですが、それは機能します!(ほとんどの場合。何らかの理由で、私の最後の列は現在の支線でアウトデントされています。)

于 2014-11-05T22:36:44.547 に答える
1

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}
于 2017-01-24T17:34:21.670 に答える
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

それが役に立ったかどうか教えてください、幸せなギッティング

于 2019-12-12T04:07:36.030 に答える
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++;
    }
?>
于 2012-05-24T11:54:04.100 に答える
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
}
于 2016-03-14T15:39:39.367 に答える