web-dev-qa-db-ja.com

最初のコマンドの後に終了せずにバッチファイルでいくつかのgitコマンドを実行するにはどうすればよいですか?

何度も繰り返さないように、常に継続的に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コマンドが終了すると、実行中のすべてを終了するために終了フラグを送り返すようですです。したがって、バッチファイルを使用してすべてを一度に実行することは、単に機能しません。それを回避する方法はありますか?

56
Pok

これがすべてのWindows gitパッケージに当てはまるかどうかはわかりませんが、少なくともいくつかはgit.cmdスクリプトを実際のgit実行可能ファイル(たとえばgit.exe)のラッパーとして使用します。したがって、バッチファイルがgitコマンドを使用している場合、Windowsは実際に別のバッチファイルを実行しています。

残念なことに、あるバッチファイルが別のバッチファイルを呼び出すと、デフォルトでは、呼び出されたバッチファイルに「ジャンプ」して戻りません(これは古代のMS-DOSコマンドプロセッサなどとの互換性のためです)。

この問題はいくつかの方法で解決できます。

  1. gitコマンドを使用してバッチファイルでcallを呼び出してgit.cmdバッチファイルを実行し、元に戻ります。

    call git checkout %2
    call git fetch Origin
    rem etc...
    
  2. .exeバッチファイルを完全に回避するために、git.cmd拡張を明示的に使用して、バッチファイルでgitを呼び出します。これが機能するためには、パスと他の環境変数がgit.exeが期待するように設定されていることを確認する必要があるかもしれません(msysgitでgit.cmdが行うことのようです):

    git.exe checkout %2
    rem etc...
    
68
Michael Burr

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内でのみ使用できます。

3
Jim Mitchener

あなたの例からわかるように、実際にはローカルブランチ「ブランチ名」を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

このコマンドは、ローカルトラッキングブランチをリモートブランチと効果的に同期します。

詳細はこちらをご覧ください:

Git pullドキュメント

Gitリモートブランチと追跡ブランチ(Progit book)

3
Eugene Sajine