たとえば、git remote --verbose
とgitは、プロジェクトにあるすべてのリモートを表示しますgit branch
はすべてのブランチを表示し、現在のブランチに通知しますが、破壊的なコマンドなしですべてのサブツリーをリストする方法は? git subtree
は使用例を示しますが、何もリストしません。サブツリーにはadd
、pull
、Push
、split
、merge
のみがあります。
これを行うための明示的な方法はありません(少なくとも、現時点では)、使用可能なコマンドのみがここにリストされています(ご存知のように、将来のシーカーのためのリファレンスです): 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の人に提案してください:)
フォローアップ 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
ログの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"