web-dev-qa-db-fra.com

Comment exécuter plusieurs commandes git dans un fichier de commandes sans terminer après la première commande?

J'ai essayé de mettre une série de commandes GIT que j'utilise toujours en continu comme fichiers batch afin de ne pas trop me répéter. Par exemple, j'ai ce fichier de commandes appelé update_repo_branch.bat pour mettre à jour un référentiel local et synchroniser une branche avec la branche distante:

@Écho off
if (% 1) == () goto end
if (% 2) == () goto end
cd% 1
git checkout% 2
git fetch Origine
git merge oring /% 2
:fin

Bon pour être paresseux, mais ce que j'ai trouvé, c'est que quand une commande GIT est terminée, il semble renvoyer un indicateur de sortie pour terminer tout ce qui est en cours d'exécution. Par conséquent, l'utilisation d'un fichier batch pour les exécuter en une seule fois ne fonctionne tout simplement pas. Une idée de comment contourner cela?

56
Pok

Je ne sais pas si cela est vrai pour tous les packages git de Windows, mais au moins certains utilisent un git.cmd script comme un wrapper autour des exécutables git réels (par exemple git.exe). Ainsi, lorsque votre fichier de commandes utilise une commande git, Windows exécute en fait un autre fichier de commandes.

Malheureusement, lorsqu'un fichier batch en appelle un autre, par défaut, il 'saute' vers le fichier batch invoqué, pour ne jamais revenir (c'est pour la compatibilité avec les anciens processeurs de commandes MS-DOS ou quelque chose).

Vous pouvez résoudre ce problème de deux manières:

  1. invoquez git dans vos fichiers de commandes à l'aide de la commande call pour exécuter le git.cmd fichier batch et revenez au vôtre:

    call git checkout %2
    call git fetch Origin
    rem etc...
    
  2. invoquez git dans votre fichier de commandes à l'aide de .exe extension explicitement pour éviter le git.cmd fichier batch en tout. Pour que cela fonctionne, vous devrez peut-être vous assurer que votre chemin et les autres variables d'environnement définissent la manière git.exe attend (cela semble être ce que git.cmd fait en msysgit):

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

En supposant que vous utilisez msysGit en tant que client Git, vous souhaiterez peut-être utiliser des scripts Bash pour cela. Vous pouvez placer une fonction bash dans votre ~/.bashrc (~ est généralement votre C:\Users\- voir ici ) comme suit

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
}

Vous pouvez ensuite exécuter update_repo_branch myrepo cool-branch à partir du shell mysysGit.

Bien sûr, cela ne sera pas accessible à partir de cmd.exe. Vous ne pourrez l'utiliser que dans le shell cygwin msysGit.

3
Jim Mitchener

Comme je le vois dans votre exemple, vous essayez en fait de synchroniser votre branche locale 'nom de branche' avec Origin/nom de branche

Pour cela, vous n'avez besoin d'aucun script supplémentaire, il vous suffit d'utiliser git pull au lieu de la séquence git checkout branchname; git fetch Origin; git merge Origin/branchname

jetez un œil aux documents sur le suivi des branches dans git et leurs avantages.

d'une manière générale si vous avez une disposition de dépôt comme celle-ci:

git branch -a
...
master
dev1
dev2
remotes/Origin/master
remotes/Origin/dev1
remotes/Origin/dev2

Et vos branches dev1 et dev2 suivent les branches pour Origin/dev1 et Origin/dev2 en conséquence, il vous suffit d'exécuter dans le référentiel:

git pull

Cette commande synchronisera efficacement toutes vos branches de suivi locales avec celles distantes.

pour plus voir ici:

Git pull docs

Git remote branches and tracking branches (Progit book)

3
Eugene Sajine