6

最終ブランチ (他のコミットの親ではない) のみであるブランチのリストを取得するにはどうすればよいですか? つまり、コミット ツリー (最終ノード) のヒントであるブランチです。コマンドで --final または --tips のようなオプションを期待してgit branchいましたが、--merged、--no-merged、および --contains オプションしかありませんでした。

4

4 に答える 4

4

すでにいくつかの有用な回答がありますが、求められているものを提供していません:リストまたはブランチ(私にとっては、コミットIDではなくブランチ名を意味します)。

先端ブランチ名のリストを取得する

{
        echo "** Below is list of tip branches a.k.a. final nodes."
        echo "** These aren't reachable from any other branches."
        echo "** Removing them is potentially DANGEROUS: it would make some commit unreachable."
        TIPS=$( git rev-list --branches --children | grep -v ' ' | sort )
        { while read branchname commitid message
                do grep $commitid < <(echo $TIPS) -q && echo $branchname
                done
        } < <(git branch -v --no-abbrev | sed 's/\*//' )
        echo "** end of list"
}

結果は次のようになります。

** Below is list of tip branches a.k.a. final nodes.
** These aren't reachable from any other branches.
** Removing them is potentially DANGEROUS: it would make some commit unreachable.
feature-workingonit
dev
** end of list

非ヒントブランチ名のリストの取得

物事を整理するとき、非先端ブランチを見たいと思うかもしれません。それらのリストを取得する方法を次に示します。唯一の変化は&&になって||います。

{
        echo "** Below is list of non-tip branches a.k.a. inner nodes."
        echo "** These are reachable from other branches."
        echo "** If you remove them, all commits would stay reachable, but be careful anyway."
        TIPS=$( git rev-list --branches --children | grep -v ' ' | sort )
        { while read branchname commitid message
                do grep $commitid < <(echo $TIPS) -q || echo $branchname
                done
        } < <(git branch -v --no-abbrev | sed 's/\*//' )
        echo "** end of list"
}

結果は次のようになります。

** Below is list of non-tip branches a.k.a. inner nodes.
** These are reachable from other branches.
** If you remove them, all commits would stay reachable, but be careful anyway.
feature-alreadymerged
master
** end of list

コミット ID とメッセージを含む非ヒント ブランチ名のリストを取得する

たとえば、次のように変更することで、必要に応じて装飾できます。

echo $branchname

の中へ

echo -e "$branchname\t$commitid\t$message"

結果は次のようになります。

** Below is list of non-tip branches a.k.a. inner nodes.
** These are reachable from other branches.
** If you remove them, all commits would stay reachable, but be careful anyway.
feature-alreadymerged   426ac5186841876163970afdcc5774d46641abc4    Cool feature foo, ref task #1234
master  39148238924687239872eea425c0e837fafdcfd9    Some commit
** end of list

次に、お気に入りのツールでそれらのブランチを確認して、それらを削除する意味があるかどうかを確認できます。

于 2014-10-21T08:12:51.073 に答える
4
git show -s --oneline --decorate $(
        git show-branch --independent -a
)

また

git show -s --format=%d $(
        git show-branch --independent -a
)

おそらくsed味わうことでしょう。たとえば、すべてのrefnameを1行に1つずつ分割し、グループ化の句読点を削除するには

git show -s --format=%d $(git show-branch --independent -a) \
| sed 's/,/\n/g; s/[ ()]//g'
于 2013-02-08T03:40:28.633 に答える
3

すべての参照のリストを取得すると、別の参照の親ではないすべての参照をリストできます。

refs=`git show-ref -s`
git log --oneline --decorate $refs --not `echo "$refs" | sed 's/$/^/'`

これは、すべての親コミットを除外することで機能します。

于 2013-02-03T19:57:02.003 に答える
2

ブランチは、作業ディレクトリでアクティブなときに新しいコミットが追加されたときに移動する単なるラベルであるため、すべてのブランチは「定義上」ツリーのリーフノードです。

しかし、他のブランチのリーフコミットと共通の祖先を共有しないブランチを求めていると思います。あなたが望むようなものですが、そうではCありEませんABまたはD以下にあります。

-A-o-B-o-C
      \
       D-o-E

その場合、別のブランチのリーフコミットである共通の祖先を共有しないすべてのブランチのリストを見つけることができます。たとえば、の現在のリーフコミットの共通の祖先を共有しDます。ED

これはスクリプトで実行できる可能性がありますが、すべてのブランチで実行できるgitコマンドはわかりません。しかし、gitは過去に、その(時にはあいまいな)コマンドパラメーターの組み合わせで何ができるかについて私を驚かせました。


私はあなたのコメントの後でもう少し考えました、そして私はあなたの質問がコマンドとして可能にならない(またはおそらく有用ではない)理由をよりよく理解していると思います。これは、のようなコマンドgit merge --squash <branch>がマージコミットを作成しないためです。作成されたコミットは、別の通常のコミットであり、別のブランチからのものであることを示すものは何も含まれていません。

たとえば、次のように始まります。

-A-o-B-o-C
      \
       D-o-E

また、コマンドでwithHEADを使用すると、インデックスに含まれるすべての変更をコミットできるようになります。コミットすると、ツリーは次のようになります。Cgit merge --squash EE

-A-o-B-o-o-C    <== notice branch `C` has moved forward one commit
      \
       D-o-E

現在のコミットには、それがどこから来たのかは言うまでもなく、 Cからのすべての変更が含まれています。今は必要ないかもしれませんが、それを伝えるにはプロジェクトの知識しかありません。D-o-ED-o-E

あなたがやりたいことは手動のプロセスになることを理解した上で。ブランチを削除できるかどうかを判断するのに役立つコマンドをいくつか考えました。

このgit logコマンドは、装飾されたコミット(ブランチ、タグ、およびHEAD)のみのグラフを生成します。

git log --all --graph --oneline --simplify-by-decoration --decorate

これを実行すると、「エンドポイント」ブランチがどこにあるかをすばやく確認できるビジュアルが得られます。>> <filename>.txtヒント:鉛筆でマークアップできるテキストファイルにグラフをダンプするために追加します。

また、保持する「エンドポイント」ブランチを特定したら、次のコマンドを実行して、からのブランチの祖先リストを表示し<branch>ます。これは、(マージコミットを使用して)完全にマージされたブランチを一覧表示してい<branch>ます。

git branch --merged <branch>

これはあなたが望むものとは正確に一致しないかもしれませんが、上で説明したように、それが可能になるとは思いません。うまくいけば、これらのコマンドが役立つでしょう。

于 2013-02-02T19:35:21.113 に答える