メンテナンスされていない古いブランチをリモートリポジトリから削除する必要があります。私は、リモートブランチを最後に変更された日付でリストする方法を見つけようとしていますが、できません。
この方法でリモートブランチを一覧表示する簡単な方法はありますか?
メンテナンスされていない古いブランチをリモートリポジトリから削除する必要があります。私は、リモートブランチを最後に変更された日付でリストする方法を見つけようとしていますが、できません。
この方法でリモートブランチを一覧表示する簡単な方法はありますか?
回答:
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
追加したい場合は、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`
」
- で行を読み取らないでください
for
。- おそらく
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 / 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」を呼び出すことができます。
authordate
(ブランチが最初に作成されたときのように見えますか?)。あなたが変更した場合authordate
にcommitterdate
、あなたは、最新の日付が各ブランチにコミット表示されます。このように:git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
オフ構築オリヴィエコロッケ相対日付を使用して、次のようにブランチ名を短くするように、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
@VonCによるコメントに追加するために、お好みの解決策を取り、便宜上〜/ .gitconfigエイリアスリストに追加します。
[alias]
branchdate = !git for-each-ref --sort='-authordate' --format='%(refname)%09%(authordate)' refs/heads | sed -e 's-refs/heads/--'
次に、単純な「git branchdate」でリストが出力されます...
--format='%(authordate)%09%(objectname:short)%09%(refname)'
各ブランチの短いハッシュも取得します。
| tac
、ただ--sort='authordate'
の代わりに-authordate
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
分岐を簡単に削除することができるかを識別するのに有用です。
ソートされたリモートブランチと各ブランチの最終コミット日。
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
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 "|"
これにより*
、現在のブランチをマークしているがキーワードに変わり、ループ本体がキーワードを見つけると、代わりにフラグを設定して何も出力しません。フラグは、次の行に代替フォーマットを使用する必要があることを示すために使用されます。私が言ったように、それは完全にハックですが、それはうまくいきます!(主に、なんらかの理由で、私の最後の列が現在の分岐線で字下げされています。)
git for-each-ref
ブランチを処理するスクリプトに適した方法です。現在のブランチを取得するには、symbolic-refを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
それが役に立ったかどうか試して私に知らせてください
または、私の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
}
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}