web-dev-qa-db-ja.com

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

Gitではプロジェクトの設定が簡単なので、小さなスクリプトでも別のリポジトリを作成できます。今、問題はそれらを管理する方法です。

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

そのため、多くのリポジトリを含むディレクトリがあります。

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

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

出力は、やるべきことを実際に気付くのに十分なほど静かでなければなりません。

68
iny

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

  • 汎用です:git(Mercurial、SVNなど)だけでなく、さまざまなバージョン管理システムの組み合わせを使用できます。
  • 高速です。mrは複数のジョブを並行して実行できます。多数のgit/Mercurialリポジトリを使用し、1日に数回同期します。氏はこのプロセスを非常に高速化しています。
  • リポジトリのチェックアウトのリストを管理するのは簡単で迅速です。カスタムスクリプトのプロジェクトのリストを変更するのではなく、「mr register」を使用してください。

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

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

alias mr='mr -d ~/ -j 5 '
40
Sandro Giessl

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

だから、mr、repo、git-submodulesを試した後、それぞれが異なる方法で不足していることがわかったので、私は独自のバリアントを作成することになりました: http://fabioz.github.io/mu-repo =この時点で成熟したツールです-それはあなたができるワークフローを持っています:

  • 複数のリポジトリのクローン
  • 複数のリポジトリでの現在の変更の差分(および編集)
  • 入ってくる変更をプレビューする
  • 複数のリポジトリでコマンドを並行して実行する
  • リポジトリのグループを作成する
  • 複数のリポジトリでgit関連以外のコマンドを実行する
  • etc(詳細は homepage をご覧ください)。

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

17
Fabio Zadrozny

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

13
Memming

カスタムmanifest.xmlファイルで repo を使用して、リポジトリの場所を指定してみてください。 ドキュメント がこれを行う方法にあります。

または、 git-submodule(1 を使用できます。

7
Spoike

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
Seth Robertson

RepoZ 」というツールを作成しました。これは、gitリポジトリを複製したり、ブランチの切り替えなどの変更を行うとすぐに自動的に検出します。

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

RepoZ UI

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

RepoZ Navigation

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

Windows用のバージョンには、リポジトリを取得またはプルするためのコンテキストメニューがあります。複数選択を使用すると、複数のリポジトリでアクションを一度に実行できます。

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

RepoZ Auto-Fetch

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

4
Waescher

このスクリプトを使用して、すべてのリポジトリで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環境変数を好みに設定することでこれをオーバーライドできます。

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

3
Scotts

これには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

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

git status-all --fetch

git status all

3
Nathan

ディレクトリで使用可能なすべてのリポジトリで(再帰的に)任意の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 "$@" \;
}

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

2
jamming

まだこのスレッドを見ている人がいる場合は、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'

2
RobBenz

あなたが望むことをするツールを作成しました!

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

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

1
francoiscabrol

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

ドキュメントから:

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

1
Brian Phillips

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

# 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.
1
ChaudPain

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

すべてを取得するにはどうすればよいですか?
マージする変更があるかどうかを確認するにはどうすればよいですか?

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

enter image description here

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

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

enter image description here

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

0
Victor Jimenez

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

Installation

npm install -g git-pull-all

使用法

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

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

git-pull-allディレクトリで~/Projectsコマンドを実行すると、子gitリポジトリが検出されるはずです(上記の場合cool-examplesおよびsuper-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
Alper Ebicoglu

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

enter image description here

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

このツールを使用して質問に答えましょう:

すべてを取得するにはどうすればよいですか?

gita fetch

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

gita lsコマンドは、ブランチ名の隣に3つの可能なシンボルを表示します。

  • +:段階的な変更
  • *:ステージングされていない変更
  • _:追跡されていないファイル/フォルダー

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

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

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

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

pip3 install -U gita
0
nos