10

私はついにGitに慣れてきました。最初の急な学習曲線の後、それはかなり良いと言わなければなりません(単一ファイルの外観が恋しいだけですが、それは別の話です)。しかし、私には解決できない問題があります。私は現在、同時に12のプロジェクトに取り組んでいます。それらはすべて相互接続されており、私は一方から他方にジャンプして、あちこちで変更を加える必要があります。

これまでのところすべて良いですが、私はそれらを非常に簡単に「ジャグリング」でき、定期的に変更をコミットします。問題は、数時間後、どのプロジェクトをリモートリポジトリにプッシュしたかを思い出せないことです。もちろん、各プロジェクトのディレクトリに「cd」してプッシュコマンドを発行することはできますが、面倒です。bashを使用して、のようなものを実行する方法があるかどうか疑問に思いましたgit find all unpushed commits in all projects in this directory。このようなコマンドは、Gitリポジトリではないが、すべてのプロジェクトのツリーが含まれているディレクトリから実行されます。

ロジックは単純ですが、実装は非常に複雑に見えます。ルートディレクトリにはすべてのプロジェクトが含まれていますが、実際のGitリポジトリは開始ディレクトリのどのレベルでも見つけることができるためです。例えば:

  • プロジェクトディレクトリ
    • 顧客X
    • project1(Gitリポジトリ)
    • 顧客U
    • project2(Gitリポジトリ)
    • project3
      • somelibrary(Gitリポジトリ)
      • テーマ(Gitリポジトリ)

この例では、太字のディレクトリのみがGitリポジトリであるため、チェックはそれらの内部で実行する必要があります。構造が少し乱雑に見えることは承知していますが、実際には非常に扱いやすいです。

どんな助けでも大歓迎です、ありがとう。

4

7 に答える 7

11

でプッシュされていないコミットを見つけることができるgit cherryので、次のようなbashスクリプトを記述できるはずです。

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    cd $file
    git cherry -v
    cd -
done

これは3層のサブディレクトリを見つけますが、見るのはおそらくあまり良くありません。

編集

Evanが示唆しているように、サブシェルを使用しcdて、ディレクトリを元に戻すことを回避できます。

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    (cd $file && git cherry -v)
done

ここのどこかにpwdコマンドを入力して、現在のファイル/ディレクトリを確認することをお勧めします...

于 2012-09-19T17:02:45.990 に答える
6

gitサブモジュールを見ることができますが、個人的にはそれらを操作するのが楽しいとは思いません。少し前に、gitリポジトリのコレクションで動作するスクリプトを作成しました:https ://github.com/mnagel/clustergit

clustergit一度に複数のリポジトリでgitコマンドを実行できます。1つのフォルダーでgitstatusを再帰的に実行すると特に便利です。、、、などをclustergitサポートします。git statusgit pullgit push

ここに画像の説明を入力してください

于 2016-06-29T08:20:33.347 に答える
5

トップレベルをgitリポジトリにし、各プロジェクトをサブモジュールにします。今、あなたは走ることができます

git submodule foreach --recursive git status # or any other command

プロジェクト内にサブモジュールがない場合は、再帰は必要ありません。

于 2012-09-19T17:21:42.437 に答える
5

要求に応じて、Gitリポジトリではないディレクトリから検索するために使用できる次のワンライナーを使用できます。これにより、プッシュされていないコミットがあるgitリポジトリへの絶対パスが一覧表示されます。

find . -type d -iname '.git' -exec sh -c 'cd "${0}/../" && git status | grep -q "is ahead of" && pwd' "{}" \;

これは、.gitディレクトリを再帰的に検索し、見つかった場合はgitプロジェクトのルートである親ディレクトリにcdすることで機能します。次に、「isahead」フレーズに対してgitstatusとgrepを実行します。これがtrueの場合、&&が実行された後のコマンド、この場合は「pwd」コマンド。ここで、独自のコマンドを挿入できます(たとえば、プッシュされていないコミットを表示するため)。

注:アクティブなブランチでプッシュされていないコミットに対してのみ機能します

于 2015-10-28T13:03:26.013 に答える
3

次のコマンドは、スペースを含むパスもサポートし、サブディレクトリを含むディレクトリのみをチェックし.gitます。

リポジトリごとのプッシュされていない変更の数(すべてのブランチ):

while IFS= read -r -d '' dir; 
    do 
        ([ -d "$dir/.git" ] && cd "$dir" && echo -n `pwd`\
        && echo " [ UNPUSHED: "`git log --branches --not --remotes | grep "^commit" | wc -l`" ]" ); 
    done < <(find -type d -print0)

リポジトリごとのコミットされていないファイルの数(ステージングおよび非ステージング):

while IFS= read -r -d '' dir; 
    do 
        ([ -d "$dir/.git" ] && cd "$dir" && echo -n `pwd`\
         && echo " [ UNCOMMITTED: "`git status -s | wc -l`" ]"); 
    done < <(find -type d -print0)

git cherryアップストリーム(-u)が設定されていない場合、git log上記は機能しますが、注は機能しません。

于 2017-06-14T20:23:08.607 に答える
2

このエイリアスを.gitconfigファイルに追加すると、親ディレクトリから実行git status-allして、すべてのgitリポジトリのステータスを再帰的に取得できます。

[alias]
status-all = "!for d in `find . -name \".git\"`; do echo \"\n*** Repository: $d ***\" && git --git-dir=$d --work-tree=$d/.. status; done"

この投稿も参照してください。

于 2015-11-18T15:35:44.980 に答える
2

を使用している方への回答ですfish。JKirchartzによる回答に基づいて、いくつかの調整を加えました。

for file in (find . -type d -maxdepth 3)
  if test -d "$file/.git"
    fish -c "cd $file; and git cherry -v; and pwd"
  end
end
于 2018-06-08T07:55:18.133 に答える