web-dev-qa-db-ja.com

ルート上のgitサブツリーを一覧表示するにはどうすればよいですか?

たとえば、git remote --verboseとgitは、プロジェクトにあるすべてのリモートを表示しますgit branchはすべてのブランチを表示し、現在のブランチに通知しますが、破壊的なコマンドなしですべてのサブツリーをリストする方法は? git subtreeは使用例を示しますが、何もリストしません。サブツリーにはaddpullPushsplitmergeのみがあります。

38
pocesar

これを行うための明示的な方法はありません(少なくとも、現時点では)、使用可能なコマンドのみがここにリストされています(ご存知のように、将来のシーカーのためのリファレンスです): https:// github。 com/git/git/blob/master/contrib/subtree/git-subtree.txt

私はコードを実行しました(基本的に、このメカニズムはすべて大きなシェルスクリプトファイルです)。すべての追跡はコミットメッセージを通じて行われるため、すべての関数がgit log独自のデータを検索するためのgrep- ingの多いメカニズム。

サブツリーにはリポジトリのルートフォルダーに同じ名前のフォルダーが必要なので、これを実行して必要な情報を取得できます(Bashシェルで)。

git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq

今、これはフォルダーが存在するかどうかをチェックしません(削除してもサブツリーメカニズムは認識しないため)、既存のサブツリーのみを一覧表示する方法は次のとおりです。これはリポジトリ内の任意のフォルダーで機能します。

 git log | grep git-subtree-dir | tr -d ' ' | cut -d ":" -f2 | sort | uniq | xargs -I {} bash -c 'if [ -d $(git rev-parse --show-toplevel)/{} ] ; then echo {}; fi'

あなたが本当にそれでいいのなら、次のバージョンに含めるようにGitの人に提案してください:)

49
Sagi Iltus

フォローアップ Sagi Illtus 'answer 、次のエイリアスを~/.gitconfigに追加します

[alias]
    ls-subtrees = !"git log | grep git-subtree-dir | awk '{ print $2 }'"

次に、リポジトリのルートからgit ls-subtreesを実行して、すべてのサブツリーパスを表示できます。

$> cd /path/to/repository
$> git ls-subtrees
some/subtree/dir
27
miraculixx

ログのgreppingの問題は、これがサブツリーがまだ存在するかどうかについて何も伝えないことです。私は単にディレクトリの存在をテストすることでこれを回避しました:

[alias]
        ls-subtrees = !"for i in $(git log | grep git-subtree-dir | sed -e 's/^.*: //g' | uniq); do test -d $i && echo $i; done"
0
Paul Mundt