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?
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:
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...
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...
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.
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: