Gitではプロジェクトの設定が簡単なので、小さなスクリプトでも別のリポジトリを作成できます。今、問題はそれらを管理する方法です。
私はこれらのリポジトリで複数の場所で働いています。リポジトリを変更したら、他の場所でリポジトリを更新できるようにしたいと思います。
そのため、多くのリポジトリを含むディレクトリがあります。
そして、これらを1つのコマンドで実行できると便利です。
出力は、やるべきことを実際に気付くのに十分なほど静かでなければなりません。
複数リポジトリツール mr を強くお勧めします。しばらくの間、他の人が推奨するカスタムシェルスクリプトを使用していましたが、mrを使用すると次の利点があります。
サイレント出力に関する質問について:コマンドラインスイッチ-qを使用して、冗長レベルを変更できます。簡潔で簡潔な要約で出力をうまく統合しているように見えるデフォルトの出力を好みます。
Mrコマンドに次のエイリアスを使用して、mrが常に$ HOMEに格納されているデフォルトのプロジェクトリストを選択し、5つの並列スレッドを使用するようにします。
alias mr='mr -d ~/ -j 5 '
現在受け入れられている答え(リポジトリを反復処理するヘルパースクリプトの束)から始めたと言わなければなりませんが、全体として、それは私にとって経験不足でした。
だから、mr、repo、git-submodulesを試した後、それぞれが異なる方法で不足していることがわかったので、私は独自のバリアントを作成することになりました: http://fabioz.github.io/mu-repo =この時点で成熟したツールです-それはあなたができるワークフローを持っています:
Pythonが実行される;)のOSをサポートすることに注意してください。
カスタムmanifest.xml
ファイルで repo を使用して、リポジトリの場所を指定してみてください。 ドキュメント がこれを行う方法にあります。
または、 git-submodule(1
) を使用できます。
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
「 RepoZ 」というツールを作成しました。これは、gitリポジトリを複製したり、ブランチの切り替えなどの変更を行うとすぐに自動的に検出します。
見つかると、リポジトリは「追跡」されます。 posh-git に触発された高密度のステータス情報を含むローカルリポジトリのリストに表示されます。これには、現在のブランチと、ファイルの編集や着信または発信コミットの数などのその他のものが含まれます。
これにより、ローカルリポジトリと未完了の作業を追跡してコミットまたはプッシュすることができます。さらに、リポジトリリストをナビゲーションとして使用して、あるリポジトリから別のリポジトリに切り替えることができます。
Windows用のバージョンには、リポジトリを取得またはプルするためのコンテキストメニューがあります。複数選択を使用すると、複数のリポジトリでアクションを一度に実行できます。
ただし、別の機能が非常に役立つ場合があります。
自動取得を使用すると、すべてのgitリポジトリのリモートをバックグラウンドで定期的に取得するようにRepoZに指示できます。もちろん、これらのフェッチはローカルコミットと衝突しません。 git pull
のようなローカルマージの試みはありません。
このスクリプトを使用して、すべてのリポジトリで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環境変数を好みに設定することでこれをオーバーライドできます。
このスクリプトは、 このスクリプト に基づいています。
これには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コマンドを実行するエイリアスと関数を作成しました。ここで見つけることができます: 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 "$@" \;
}
それが役に立てば幸い :)
まだこのスレッドを見ている人がいる場合は、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'
あなたが望むことをするツールを作成しました!
gmaster fetch
gmaster status
gmaster status
Gitmasterと呼ばれます: https://github.com/francoiscabrol/gitmaster
ディレクトリツリー内のすべてのリポジトリに対してgitコマンドを再帰的に実行するCPANで rgit をチェックアウトする必要があります。
ドキュメントから:
このユーティリティは、すべてのgitリポジトリをルートディレクトリ(現在の作業ディレクトリまたは設定されている場合はGIT_DIR環境変数で指定されたディレクトリ)で再帰的に検索し、このリストをリポジトリパスでソートし、それぞれにchdirします。そして、指定されたgitコマンドを実行します。
すべての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.
免責事項: www.repoflow.com でこのツールに取り組んでいます
すべてを取得するにはどうすればよいですか?
マージする変更があるかどうかを確認するにはどうすればよいですか?
コミットされていない変更があるかどうかを確認するにはどうすればよいですか?
私はこれに取り組んでいますが、これはOPの問題を解決し、一般的に複数のリポジトリを管理するのに役立ちます。UIまたは基礎となるGraphQL APIを使用して独自のスクリプトを作成できます。別のオプションとして検討してください。
すべての複数のリポジトリを取得する便利なツールがあります。 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-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
gita というコマンドラインツールを作成して、複数のリポジトリを管理しました。たとえば、登録されたリポジトリのステータスが並んで表示されます。
また、任意の作業ディレクトリからgitコマンド/エイリアスを委任することもできます。
このツールを使用して質問に答えましょう:
すべてを取得するにはどうすればよいですか?
gita fetch
コミットされていない変更があるかどうかを確認するにはどうすればよいですか?
gita ls
コマンドは、ブランチ名の隣に3つの可能なシンボルを表示します。
+
:段階的な変更*
:ステージングされていない変更_
:追跡されていないファイル/フォルダーそれらのいずれかにマージする変更があるかどうかを確認するにはどうすればよいですか?
ブランチ名は5つの方法で色付けされています
それをインストールするには、単に実行します
pip3 install -U gita