何度も繰り返さないように、常に継続的にtogeterをバッチファイルとして使用する一連のGITコマンドを配置しようとしました。たとえば、ローカルリポジトリを更新し、ブランチをリモートブランチと同期するupdate_repo_branch.bat
というバッチファイルがあります。
@エコーオフ
if(%1)==()goto end
if(%2)==()goto end
cd%1
git checkout%2
git fetch Origin
git merge oring /%2
:終わり
怠zyであることは良いことですが、私が見つけたのはGITコマンドが終了すると、実行中のすべてを終了するために終了フラグを送り返すようですです。したがって、バッチファイルを使用してすべてを一度に実行することは、単に機能しません。それを回避する方法はありますか?
これがすべてのWindows gitパッケージに当てはまるかどうかはわかりませんが、少なくともいくつかはgit.cmd
スクリプトを実際のgit実行可能ファイル(たとえばgit.exe
)のラッパーとして使用します。したがって、バッチファイルがgit
コマンドを使用している場合、Windowsは実際に別のバッチファイルを実行しています。
残念なことに、あるバッチファイルが別のバッチファイルを呼び出すと、デフォルトでは、呼び出されたバッチファイルに「ジャンプ」して戻りません(これは古代のMS-DOSコマンドプロセッサなどとの互換性のためです)。
この問題はいくつかの方法で解決できます。
git
コマンドを使用してバッチファイルでcall
を呼び出してgit.cmd
バッチファイルを実行し、元に戻ります。
call git checkout %2
call git fetch Origin
rem etc...
.exe
バッチファイルを完全に回避するために、git.cmd
拡張を明示的に使用して、バッチファイルでgit
を呼び出します。これが機能するためには、パスと他の環境変数がgit.exe
が期待するように設定されていることを確認する必要があるかもしれません(msysgitでgit.cmd
が行うことのようです):
git.exe checkout %2
rem etc...
GitクライアントとしてmsysGitを使用していると仮定すると、実際にはこれにBashスクリプトを使用することができます。次のように~/.bashrc
(〜は通常C:\ Users \- こちらを参照 )にbash関数を配置できます
update_repo_branch() {
if [ $# != "2" ]; then
echo "Usage: update_repo_branch REPO BRANCH" 1>&2
return 1
fi
cd $1
git checkout $2
git fetch Origin
git merge Origin/$2
}
その後、mysysGitシェルからupdate_repo_branch myrepo cool-branch
を実行できます。
もちろん、これはcmd.exeからアクセスできません。 msysGit cygwin Shell内でのみ使用できます。
あなたの例からわかるように、実際にはローカルブランチ「ブランチ名」をOrigin /ブランチ名と同期しようとしています
このため、追加のスクリプトは必要ありません。使用する必要があるのはgit pull
シーケンスの代わりにgit checkout branchname; git fetch Origin; git merge Origin/branchname
gitでのブランチの追跡とその利点に関するドキュメントをご覧ください。
一般的に、次のようなレポレイアウトがある場合:
git branch -a
...
master
dev1
dev2
remotes/Origin/master
remotes/Origin/dev1
remotes/Origin/dev2
そして、dev1とdev2ブランチはOrigin/dev1とOrigin/dev2のブランチを追跡しているので、リポジトリで実行するだけです。
git pull
このコマンドは、ローカルトラッキングブランチをリモートブランチと効果的に同期します。
詳細はこちらをご覧ください: