65 votes

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

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

@echo off
if(%1) == () goto end
if(%2) == () goto end
cd %1
git checkout %2
git fetch origin
git merge oring/%2
end

C'est bien d'être paresseux, mais ce que j'ai trouvé, c'est que lorsqu'une commande GIT est terminée, elle semble envoyer un signal 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 tous en une seule fois ne fonctionne tout simplement pas. Avez-vous une idée de comment contourner cela?

0 votes

Donc, seul git checkout est effectué?

81voto

Michael Burr Points 181287

Je ne suis pas sûr que cela soit vrai pour tous les packages git Windows, mais au moins certains utilisent un script git.cmd comme un wrapper autour des exécutables git réels (par exemple git.exe). Donc, lorsque votre fichier batch utilise une commande git, Windows exécute en réalité un autre fichier batch.

Malheureusement, lorsque qu'un fichier batch invoque un autre, par défaut il "saute" vers le fichier batch invoqué, sans jamais revenir (c'est pour la compatibilité avec les anciens processeurs de commandes MS-DOS ou quelque chose du genre).

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

  1. Invoquez git dans vos fichiers batch en utilisant la commande call pour exécuter le fichier batch git.cmd et revenir ensuite au vôtre:

    call git checkout %2
    call git fetch origin
    rem etc...
  2. Invoquez git dans votre fichier batch en utilisant explicitement l'extension .exe pour éviter complètement le fichier batch git.cmd. Pour que cela fonctionne, vous devrez peut-être vous assurer que votre chemin d'accès et d'autres variables d'environnement sont configurés de la manière dont git.exe s'attend à ce qu'ils le soient (c'est apparemment ce que fait git.cmd dans msysgit):

    git.exe checkout %2
    rem etc...

6 votes

Depuis call ne fait rien d'inattendu avec les programmes normaux, c'est en fait une bonne façon de contourner complètement cela, peu importe le git qu'ils utilisent (je ne savais même pas qu'il y en avait autant).

2 votes

+1. Le comportement décrit par l'OP est très probablement confirmé par le fait que git est en effet un script batch. On ne s'attend guère à ce qu'un programme exe se comporte de cette manière. Et je suis d'accord avec Joey, CALL ne ferait pas de mal même si le programme s'avérait être un exe.

2 votes

Tu as déverrouillé mon cœur avec ta solution! Merci un million de fois!

4voto

jcm Points 4968

En supposant que vous utilisez msysGit comme client Git, vous voudrez peut-être utiliser des scripts Bash pour cela. Vous pourriez 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 "Utilisation : update_repo_branch REPO BRANCHE" 1>&2
        return 1
    fi

    cd $1
    git checkout $2
    git fetch origin
    git merge origin/$2
}

Vous pouvez alors exécuter update_repo_branch myrepo cool-branch à partir de l'invite de commandes mysysGit.

Évidemment, cela ne sera pas accessible depuis cmd.exe. Vous ne pourrez l'utiliser que dans l'invite de commandes cygwin de msysGit.

2voto

Eugene Sajine Points 1696

Tel que je le vois à partir de votre exemple, vous essayez en réalité de synchroniser votre branche locale 'branchname' avec origin/branchname

Pour cela, vous n'avez pas besoin de script supplémentaire, il vous suffit d'utiliser git pull à la place de la séquence git checkout branchname; git fetch origin; git merge origin/branchname

Jetez un œil à la documentation sur les branches de suivi dans git et leurs avantages.

En général, si vous avez une disposition de répertoire comme celle-ci :

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

Et que vos branches dev1 et dev2 sont des branches de suivi pour origin/dev1 et origin/dev2 respectivement, alors il vous suffit d'exécuter dans le dépôt :

git pull

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

Pour en savoir plus, consultez ici :

Documentation sur Git pull

Branches distantes et branches de suivi Git (Livre Progit)

0voto

Créez un fichier bloc-notes et collez le contenu ci-dessous, puis enregistrez-le avec l'extension .bat.

Ce script peut être utilisé pour configurer git pour la première fois dans un projet.

!echo off
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin 
git push -u origin main
pause

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X