多くのgitリポジトリを管理する


87

プロジェクトのセットアップはgitで簡単なので、小さなスクリプトでも別のリポジトリを作成できます。今問題はそれらをどのように管理するかです。

私はこれらのリポジトリで複数の場所で働いています。あるリポジトリに変更を加えたら、他の場所のリポジトリを更新できるようにしたいと思います。

だから私はその中に多くのリポジトリがあるディレクトリを持っています。

  1. どうすればそれらすべてをフェッチできますか?
  2. それらのいずれかにコミットされていない変更があるかどうかを確認するにはどうすればよいですか?
  3. それらのいずれかにマージする変更があるかどうかを確認するにはどうすればよいですか?

そして、これらを1つのコマンドで実行できると便利です。

出力は、実際にやるべきことに気付くのに十分なほど静かである必要があります。


同じ質問に答えましたhg mercurial
Serge Stroobandt 2018

コードエディター(VSコード)のマルチカーソル選択/複数行編集機能を使用して、バッチ/シェルスクリプトを作成し、一度に実行します。この単純な愚かな解決策で、私は自分が何をしているのか、そしてそれらのコマンドの実行から何を期待できるのかを知っています。推測も学習もカスタマイズも必要ありません。もう1つの理由は、共通の親ディレクトリにある異なるリポジトリのセットでコマンドを実行するたびにです。
IsmailS

回答:


45

複数のリポジトリツールmrを強くお勧めします。以前は他の人が推奨するカスタムシェルスクリプトを使用していましたが、mrを使用すると次のような利点があります。

  • これは一般的です。gitだけでなく、さまざまなバージョン管理システムを組み合わせて使用​​できます(Mercurial、SVNなど)。
  • 高速です。mrは複数のジョブを並行して実行できます。私はいくつかのgit / mercurialリポジトリを使用し、それらを1日に数回同期します。氏はこのプロセスを大幅にスピードアップします。
  • リポジトリのチェックアウトのリストを管理するのは簡単で迅速です。カスタムスクリプトのプロジェクトのリストを変更するのではなく、「mrregister」を使用するだけです。

サイレント出力に関する質問について:冗長性のレベルは、コマンドラインスイッチ-qを使用して変更できます。私は、短く明確な要約で出力をうまく統合しているように見えるデフォルトの出力を好みます。

mrコマンドに次のエイリアスを使用して、mrが常に$ HOMEに格納されているデフォルトのプロジェクトリストを取得し、5つの並列スレッドを使用するようにします。

alias mr='mr -d ~/ -j 5 '

それは素晴らしいですが、gitタグ付けをサポートしていません(2016-08現在)
Hugo Zaragoza

@CADblokeは、インストールページのウィンドウについては言及していませんが、Perlスクリプトとして、ウィンドウで動作する可能性があります。
scipilot 2017

2
@HugoZaragoza、このコマンドはいつでも自分で定義できます[DEFAULT] tag = git tag "$ @"
AlexS 2018

2
alias pa='find . -name .git -print -execdir git pull \;'それならpa十分です
DawnSong 2018

19

私は現在受け入れられている答え(リポジトリを反復処理する一連のヘルパースクリプト)から始めたと言わなければなりませんが、全体として、それは私にとって不足した経験でした。

だから、MR、レポとのgit -サブモジュールを試した後、私は、別の方法で各欠けを見つけ、私は私自身のバリアントやってしまった:http://fabioz.github.io/mu-repoをで成熟したツールでありますこの点-次のことができるワークフローがあります。

  • 複数のリポジトリのクローンを作成する
  • 複数のリポジトリの現在の変更を差分(および編集)する
  • 着信変更のプレビュー
  • 複数のリポジトリでコマンドを並行して実行する
  • リポジトリのグループを作成する
  • 複数のリポジトリでgit関連以外のコマンドを実行する
  • など(詳細についてはホームページを参照してください)。

Pythonが実行されているすべてのOSをサポートしていることに注意してください;)


あなたの答えは、mu-repoがmrよりも優れていることを示唆しています。ただし、mu-repoは非gitリポジトリをサポートしていません。
ShaunakSontakke20年

1
ええと、それは本当にgitリポジトリのみをサポートすることです(これは質問が尋ねたものです)-mu sh <some command>複数のリポジトリで任意のコマンドを実行することもできますが、その最終的な結果はgitを扱い、他のバージョン管理システムは扱いません。 。それが必要な場合は、はい、別のツールを使用してください。
FabioZadrozny20年

14

gr(git-run)は、 mrの機能を拡張します(のみgit)。タグシステムを使用すると、複数のgitリポジトリを整理する方が簡単だと思います。grただし、のコードは適切に維持されていません。bashを使用している場合は-t tag#tagフォームの代わりに使用してください。


それ以来、開発は少し回復しているようです:github.com/mixu/gr/graphs/contributors
Dave Forgac 2015年

8

あなたは、使用してみてください可能性がレポをカスタムでmanifest.xmlあなたのリポジトリがどこにあるかを指定するファイル。これを行う方法に関するいくつかのドキュメントがあります。

別の方法としては、使用することができますgit-submodule(1


2
リポジトリをまったく同じ状態に保ちたい場合は、git-submoduleが適していますが、そうではありません。リポジトリのセットは、各場所で同じではありません。コミットされていない変更がある可能性があります。まだマージしたくない変更があるかもしれません。
iny 2009年

私はgit-submoduleについて知りませんでした。言及してくれてありがとう。
sykora 2009年

リポジトリのドキュメントはごくわずかで、使用したいさまざまな種類のワークフローを対象としているように見えます。
iny 2009年

6

たとえば、クローンを作成したり、ブランチの切り替えなどで変更したりするとすぐにgitリポジトリを自動的に検出する「RepoZ」というツールを作成しました。

見つかったら、リポジトリは「追跡」されます。これにより、posh-gitに触発された高密度のステータス情報を含むローカルリポジトリのリストにそれらが表示されます。これには、現在のブランチと、ファイル編集や着信または発信コミットの数などのその他のものが含まれます。

RepoZ UI

これは、ローカルリポジトリとコミットまたはプッシュする未完了の作業を追跡するのに役立ちます。さらに、リポジトリリストをナビゲーションとして使用して、あるリポジトリから別のリポジトリに切り替えることができます。

RepoZナビゲーション

「どうすればそれらすべてを取得できますか?」

Windows用のバージョンは、リポジトリをフェッチまたはプルするためのコンテキストメニューを提供します。複数選択を使用すると、複数のリポジトリで一度にアクションを実行できます。

ただし、別の機能が非常に役立つ場合があります。

RepoZ自動フェッチ

自動フェッチを使用すると、すべてのgitリポジトリのリモートをバックグラウンドで定期的にフェッチするようにRepoZに指示できます。もちろん、これらのフェッチはローカルコミットと衝突しません。のようなローカルマージの試みはありませんgit pull


ええ、あまりにも悪くて、値しない。いつでもPRのために開いています。私にpingします。
Waescher

5

gitslaveは、スーパーとサブの間にスーパープロジェクト/サブプロジェクトの関係を作成することにより、多くのリポジトリで同じコマンドを実行できるツールです。これは(デフォルトで)出力の要約を提供するため、一意の出力を提供するリポジトリに集中できます(gitステータスには役立ちますが、git lsファイルにはあま​​り役立ちません)。

これは通常、複数のリポジトリをまとめて、同じブランチまたはタグに同時に保持する必要があるプロジェクトに使用されます。(ベア)リポジトリのディレクトリには、任意のgitコマンドを実行できる小さなmakefileがあります。これは、ご覧のとおり、主にfsckとgcに使用します。

full: fsck-full gc-aggressive
        @:

fsck-full:
        for f in */.; do (cd $$f; echo $$f; git fsck --full || echo $$f FAILED); done

gc-aggressive:
        for f in */.; do (cd $$f; echo $$f; git gc --aggressive || echo $$f FAILED); done

%:
        for f in */.; do (cd $$f; git $@ || echo $$f FAILED); done

5

ディレクトリで利用可能なすべてのリポジトリで任意のgitコマンドを(再帰的に)実行するためのエイリアスと関数を作成しました。あなたはここでそれを見つけることができます: https //github.com/jaguililla/dotfiles/git

これはコードです:

#!/bin/sh
# To use it: source git_aliases

# Example: rgita remote \;
alias rgita='find . -type d -name .git -execdir git'

# Example: rgit remote -vv
rgit() {
  rgita "$@" \;
}

それが役に立てば幸い :)


1
スリムで便利!
ケビンチョウ

ファンタスティック!入れる簡単なワンライナー.bash_aliasesalias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'。それを調達し、例えば、を呼び出しますrgit status
ford 0420

4

git-status-allこれにはgemを使用できます:https//github.com/reednj/git-status-all

# install the gem    
gem install git-status-all

# use the status-all subcommand to scan the directory
git status-all

ステータスを表示する前に、すべてのリポジトリのオリジンからフェッチするフェッチオプションもあります。

git status-all --fetch

git status all


1
とても素敵なアプローチ。投票数の多いツールのほとんどとは対照的に、最初にリポジトリを登録する必要はありません。代わりに、すべてのサブディレクトリをチェックするだけです。
luator 2018

find . -name .git -print -execdir git status \;大丈夫です
DawnSong 2018

3

このスクリプトを使用して、すべてのリポジトリでgitコマンドを簡単に実行します。

#!/bin/sh
if [ ! "$1" = "" ] ; then

   if [ "$GITREPO" = "" -a -d "$HOME/cm/src" ] ; then
      GITREPO="$HOME/cm/src"
   fi

   if [ "$GITREPO" != "" ] ; then

      echo "Git repositories found in $GITREPO"
      echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-"

      DIRS="`/bin/ls -1 $GITREPO`"

      for dir in $DIRS ; do

         if [ -d $GITREPO/$dir/.git ] ; then
            echo "$dir -> git $1"
            cd $GITREPO/$dir ; git $@
            echo
         fi

      done
   else

      echo "Git repositories not found."

   fi
fi

デフォルトでは、スクリプトは〜/ cm / srcでgitリポジトリを検索しますが、GITREPO環境変数を好みに設定することでこれをオーバーライドできます。

このスクリプトは、このスクリプトに基づいています


find . -name .git -print -execdir git pull \;あなたが思うことをします。
DawnSong 2018

3

複数のリポジトリを管理するために、gitaというコマンドラインツールを作成しました。登録されたリポジトリのステータスを並べて表示します。

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

また、任意の作業ディレクトリからgitコマンド/エイリアスを委任することもできます。

このツールを使用して質問に答えます。

どうすればそれらすべてをフェッチできますか?

gita fetch

それらのいずれかにコミットされていない変更があるかどうかを確認するにはどうすればよいですか?

このgita lsコマンドは、ブランチ名の横に3つの可能な記号を表示します。

  • +:段階的な変更
  • *:段階的でない変更
  • _:追跡されていないファイル/フォルダ

それらのいずれかにマージする変更があるかどうかを確認するにはどうすればよいですか?

ブランチ名は5つの方法で色分けされています

  • 白:ローカルブランチにはリモートブランチがありません
  • 緑:ローカルブランチはリモートブランチと同じです
  • 赤:ローカルブランチがリモートブランチから分岐しています
  • 紫:ローカルブランチがリモートブランチよりも進んでいます(プッシュに適しています)
  • 黄色:ローカルブランチがリモートブランチの背後にあります(マージに適しています)

インストールするには、単に実行します

pip3 install -U gita

2

誰かがまだこのスレッドを見ているなら、gitmeと呼ばれる私のシェルスクリプトをチェックアウトしてください

ローカルのgitリポジトリを手動で入力する必要がありますが、私は毎日このツールを使用して、複数のコンピューターで複数のgitプロジェクトを共同作業しています。

あなたは走ることができます git clone https://github.com/robbenz/gitme.git

また、スクリプトは以下に掲載されています

#!/bin/bash -e

REPOS=( 
/Users/you/gitrepo1
/Users/you/gitrepo2
/Users/you/gitrepo3
/Users/you/gitrepo4
)

MOVE="Moving to next REPO... \n" 

tput setaf 2;echo "What ya wanna do? You can say push, pull, commit, ftp push, or status"; tput sgr0

read input

if [ $input =  "commit" ]
then
    tput setaf 2;echo "Do you want a unique commit message? [y/n]";tput sgr0
    read ans
    if [ $ans = "y" ]
    then 
        for i in "${REPOS[@]}"
        do
            cd "$i"
            tput setaf 6;pwd;tput sgr0 
            git add . -A
            read -p "Commit description: " desc  
            git commit -m "$desc"
            tput setaf 2;echo  $MOVE;tput sgr0 
            sleep 1
        done 
    else 
        for i in "${REPOS[@]}"
        do
            cd "$i"
            tput setaf 6;pwd;tput sgr0 
            git add . -A
            git commit -m "autocommit backup point"
            tput setaf 2;echo  $MOVE;tput sgr0 
            sleep 1
        done
    fi 
elif [ $input = "push" ] || [ $input = "pull" ] || [ $input = "ftp push" ] || [ $input = "status" ]
    then
        for i in "${REPOS[@]}"
do
    cd "$i"
    tput setaf 6;pwd;tput sgr0 
    git $input 
    tput setaf 2;echo  $MOVE;tput sgr0 
    sleep 1
    done 
else tput setaf 1;echo "You have zero friends";tput sgr0 
fi

〜/ .bash_profileにエイリアスを設定したので、 alias gitme='sh /path/to/gitme.sh'


1

ディレクトリツリー内のすべてのリポジトリでgitコマンドを再帰的に実行するCPANでrgitをチェックアウトする必要があります。

ドキュメントから:

このユーティリティは、ルートディレクトリ(現在の作業ディレクトリ、または設定されている場合はGIT_DIR環境変数で指定されたディレクトリ)ですべてのgitリポジトリを再帰的に検索し、このリストをリポジトリパス、chdirで並べ替えます。それらを実行し、指定されたgitコマンドを実行します。


1

私はあなたがやりたいことをするツールを作成しました!

  1. どうすればそれらすべてをフェッチできますか? gmaster fetch
  2. それらのいずれかにコミットされていない変更があるかどうかを確認するにはどうすればよいですか? gmaster status
  3. それらのいずれかにマージする変更があるかどうかを確認するにはどうすればよいですか? gmaster status

それはgitmasterと呼ばれます:https//github.com/francoiscabrol/gitmaster


1

この単純なbash関数を.bash_profileに記述して、すべてのgitリポジトリでのみgit、maven、gradle、またはその他のbashコマンドを実行できるようにしました。

# usefull function to work with multiple git repositories
all() {
    failed=0
    printf '>>> START RUNNING: "%s" >>>' "$*"
    for d in */; do
        pushd "$d" > /dev/null
        if [ -d ".git" ]
        then
            printf '\n--------------------------------------------\n\n'
            pwd
            eval $@
            if [ $? -ne 0 ]
            then
                failed=1
                break;
            fi
        fi
        popd > /dev/null
    done
    if [ $failed -eq 0 ]
    then
        printf '\n--------------------------------------------\n'
        printf '<<< RAN "%s" WITH SUCCESS!!! <<<' "$*"
    else
        printf '\n<<< FAILED!!! <<<'
    fi
}

これはこのように使用できます

all git st
all git pull
all ./gradlew clean test
etc.

次を使用して、それらをすべて並行して実行することもできます:all './ gradlew clean test&'
ChaudPain 2018

0

免責事項:私はwww.repoflow.comでこのツールに取り組んでいます

どうすればそれらすべてをフェッチできますか?
それらのいずれかにマージする変更があるかどうかを確認するにはどうすればよいですか?

  • 関連するすべてのリポジトリをフェッチ(またはプッシュ/プル/コミット)できます。フェッチ後にUIが新しいリポジトリの状態で更新されます。リポジトリが分岐している場合は、競合の種類を確認してマージを開始できます。

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

それらのいずれかにコミットされていない変更があるかどうかを確認するにはどうすればよいですか?

  • UIで、各リポジトリのファイルの状態を確認できます(ファイルを個別にまたは一括で追加/削除できます)。

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

私はこれに取り組んでいますが、これはOPの質問を解決し、一般に複数のリポジトリを管理するのに役立ちます。UIまたは基盤となるGraphQL APIを使用して、独自のスクリプトを作成できます。別のオプションとして検討してください。


0

複数のリポジトリをすべてフェッチするための便利なツールがあります。 git-pull-allは、非同期で複数のgitリポジトリで実行するコマンドラインツールです。

インストール

npm install -g git-pull-all

使用法

これらのファイルとディレクトリがあると仮定します。

~/Projects/
  cool-examples/
    .git/
  funny-movies/
  my-todos.txt
  super-express/
    .git/

ディレクトリでgit-pull-allコマンドを実行すると~/Projects、子gitリポジトリ(上記の場合はcool-examplessuper-express)が見つかりgit pull、それぞれで実行されます。

$ cd ~/Projects
$ git-pull-all
funny-movies/
Not a git repository
cool-examples/
Already up-to-date.
super-express/
Already up-to-date.
Done!
git-pull-all ~/Projects

GitHubリンク:https//github.com/tatsuyaoiw/git-pull-all


0

VisualStudioコードを使用しています。コードベースには、すべて個別のGitリポジトリである約20のライブラリがあり、Visual Studio Codeのソース管理タブは、ローカルリポジトリがどれだけ遅れているかまたは進んでいるかを「一目で」確認するのに非常に適しています。その情報を最新の状態に保つために定期的にフェッチする設定や、更新ボタンもあります。

スクリプトほど便利ではありませんが、ソース管理に関しては、変更を加えるのが好きです。変更などを上書きしないように注意するには、非常によく記述されたスクリプトが必要です。VSCodeアプローチを使用すると、自分で操作できる大量の情報をすばやく取得できます。

これがどのように見えるかのスクリーンショットです:

VSCodeのソース管理ウィンドウ


0

各リポジトリに異なるブランチがチェックアウトされている場合でも、.gitフォルダーを持つすべてのサブディレクトリから現在のブランチからプルするための優れたソリューションを見つけました。このコマンドはワンライナーであり、さまざまなgitコマンドに合わせて変更できる柔軟性があり、エイリアスを設定できます。

以下をコピーして貼り付けるだけです。

find . -type d -maxdepth 2 -name .git -exec sh -c 'cd $0 && cd .. && git pull origin $(git rev-parse --abbrev-ref HEAD)' {} \;

それを分解する:

find . -type d -maxdepth 2 -name .git 

「.git」(-name .git)という名前の現在のディレクトリ(find。)内のすべてのディレクトリ(-type d)を検索し、最大2つのディレクトリの深さ(1ではなく2)を検索します。 git repoフォルダー内のgitフォルダー)。

-exec sh -c 

次のシェルコマンドを実行します(exec sh -c)

'cd $0 && cd .. && git pull origin $(git rev-parse --abbrev-ref HEAD)'

ディレクトリを最初の引数(cd $ 0)に変更し、ディレクトリを1レベル上に変更して.gitフォルダ(cd ..)を残し、現在のブランチに対してgit rev-parse ...を実行してブランチを指定しながらgitpulloriginを実行します。 HEADコミット。

{} \;

「{}」は、最初のfindコマンドから取得した結果の相対パスです。; コマンドを終了するために使用されます。

zsh上のMacOS10.14.6でテスト済み。現状では、リモートブランチとローカルブランチに同じ名前のAFAIKがある場合にのみ機能します。

これを変更してステータスを取得できます。これをさらに柔軟にするために引数を追加できるかもしれないと思いますが、私はまだ試していません。


0

コードエディター(VSコード)のマルチカーソル選択/複数行編集機能を使用して、バッチ/シェルスクリプトを作成し、一度に実行します。この単純な愚かな解決策で、私は自分が何をしているのか、そしてそれらのコマンドの実行から何を期待できるのかを知っています。推測も学習もカスタマイズも必要ありません。もう1つの理由は、共通の親ディレクトリにある異なるリポジトリのセットでコマンドを実行するたびにです。


-1

https://github.com/wwjamieson3/envisionToolsには、これを実行するgitstatと呼ばれるbashスクリプトがあります。それはGNUとMacと互換性があります。要求された場合、リモートからのフェッチを実行できます。追跡されていない、変更された、追加された、削除された、ステージングされたファイルが表示されます。リモートでのマージされていないコミットとプッシュされていないローカルコミットを表示することで、リモートとは異なります。また、色分けされた結果を要約モードまたは詳細モード、さらにはHTMLで表示することもできます。検索の代わりに検索を使用します。これは、非常に高速であり、データベースが古くなりすぎると、検索データベースの更新を求めるプロンプトが表示されるためです。


2
あなたの答えを投稿してくれてありがとう!セルフプロモーションに関するFAQをよくお読みください。また、自分のサイト/製品にリンクするたびに免責事項を投稿する必要があることにも注意してください。
Andrew Barber

3
残念ながら、github wwjamieson3 / envisionToolsリンクが壊れています。
ブレンダJ.バトラー

@williamJamiesonはenvisionToolsはプライベートGitHubリポジトリですか?
eebbesen 2015

-5

それを行うためのスクリプトを書くのはとても簡単なようです。基本的に、リポジトリを反復処理してから、git ls-files、git diff、gitlogなどのコマンドを使用する必要があります。


遅いのは知っていますが、スクリプトを公開してもらえますか?
l0b0 2009

「スクリプト」はありません。自分のニーズに合わせて作成したスクリプトを使用していますが、一般的ではありません。
iny 2009

「gitdiff」は、単一のパッチコマンドで元に戻して再適用できる単一のdiffファイルを取得する場合、実際には注意が必要です。
proski 2015年

4
文字通り、答えはどれも受け入れられた答えでなければなりませんが、これです。
ケネットセレステ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.