100

プロジェクトのセットアップは git で簡単なので、小さなスクリプトでも別のリポジトリを持つことができます。さて、問題はそれらをどう管理するかです。

私はこれらのリポジトリを使用して複数の場所で作業しています。一部のリポジトリに変更を加えた場合、他の場所のリポジトリを更新できるようにしたいと考えています。

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

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

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

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

4

24 に答える 24

46

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

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

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

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

alias mr='mr -d ~/ -j 5 '
于 2011-02-28T11:06:47.563 に答える
21

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

したがって、mr、repo、および git-submodules を試した後、それぞれが異なる方法で欠けていることがわかったので、最終的に独自のバリアントを作成しました: http://fabioz.github.io/mu-repoで成熟したツールですこの点 -- 次のことができるワークフローがあります。

  • 複数のリポジトリを複製する
  • 複数のリポジトリで現在の変更を比較 (および編集) する
  • 受信した変更をプレビューする
  • 複数のリポジトリでコマンドを並行して実行する
  • リポジトリのグループを作成する
  • 複数のリポジトリで非 git 関連のコマンドを実行する
  • など(詳細については、ホームページを参照)。

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

于 2012-07-03T00:27:25.977 に答える
8

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

git-submodule(1または、 )を使用することもできます。

于 2009-05-03T09:30:52.157 に答える
5

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

これは通常、複数のリポジトリをまとめて、同じブランチまたはタグに同時に保持する必要があるプロジェクトで使用されます。(ベア) リポジトリのディレクトリには、任意の 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
于 2012-03-15T16:11:42.003 に答える
4

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

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

于 2009-05-07T19:51:48.620 に答える
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'

于 2015-12-18T15:59:32.847 に答える
1

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

ドキュメントから:

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

于 2009-05-03T13:22:34.580 に答える
0

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

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

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

VS Code のソース管理ウィンドウ

于 2019-09-24T16:37:30.573 に答える
0

以下の手順に従って、すべてのリポジトリからコードをプルしてください。

  1. 拡張子を .bat として新しいファイルを作成します
  2. そのファイルを、すべてのリポジトリフォルダーがある同じ階層に配置します
  3. .bat ファイルを編集し、以下のスクリプトを追加します
FOR /D %%G in (%cd%\*) Do cd %%G & call git branch & call git pull & cd ..
echo All code pulled successfully!!
pause
  1. ファイルを保存し、ダブルクリックしてコードのプルを開始します
于 2021-07-09T21:14:54.360 に答える
-1

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

于 2012-11-24T10:18:00.047 に答える
-6

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

于 2009-05-03T14:13:28.610 に答える