En tant que documented et discussed ailleurs, git fetch
refuse d'aller chercher la branche en cours à moins que vous ne fournissiez l'option -u
.Equivalent de updateInstead pour git fetch -u
Ce comportement est parfaitement logique dans la plupart des cas, et est évidemment le comportement par défaut correct. Cependant, ce n'est pas le comportement que je veux. Au lieu de cela, je voudrais quelque chose comme ce que fait l'option de configuration receive.denyCurrentBranch=updateInstead
: si l'arbre de travail et l'index actuels correspondent à HEAD
, alors autorisez l'extraction et la mise à jour de l'arbre de travail; sinon, refusez l'extraction avec un message similaire à celui par défaut. Y at-il un moyen de le faire sans écrire ma propre commande de porcelaine en utilisant git fetch -u
?
La raison pour laquelle je veux que cela, dans le cas où un meilleur flux de travail est disponible, est que je travaille sur un certain nombre de projets stockés dans des dépôts Git séparés. La plupart d'entre eux se trouvent sur la branche locale dev
, qui a la branche distante dev/master
en amont. Quand je suis en train de faire du développement, je le fais sur une branche portant le nom de n'importe quelle entité sur laquelle je travaille, pas la branche dev
. Je veux toutes les branches distantes disponibles, donc je dois faire un git fetch --all -p
régulièrement, et je dois aussi faire un git pull
dans les projets que je ne construis pas pour avoir le dernier code. Parce qu'il y a beaucoup de projets, le plus simple est de simplement les parcourir dans Bash et d'exécuter git fetch --all -p; git pull
sur chacun d'entre eux. Malheureusement, cela exécute aussi git pull
sur les projets sur lesquels je suis en train de faire des changements, et cela pourrait conduire à des conflits de fusion au lieu de simplement obtenir les dernières dépendances. Au lieu de cela, j'aimerais que les projets sur lesquels je ne travaille pas actuellement mettent à jour automatiquement l'arborescence de travail; alors j'ai seulement besoin de lancer git pull
sur les dépôts sur lesquels je travaille actuellement. De cette façon, je peux l'exécuter seulement quand c'est approprié, et ne pas m'inquiéter des conflits de fusion quand je veux juste construire contre la dernière source des projets dépendants.
'git fetch' lui-même ne met jamais à jour l'index et l'arbre de travail. Je pense que vous avez probablement besoin d'écrire votre propre porcelaine ici. Notez que 'git-sh-setup' fournit un moyen de tester si l'index et l'arbre de travail sont" propres "(correspondent à la validation' HEAD'), y compris les sous-modules, sans avoir à analyser la sortie de 'git status'. Notez aussi que 'git pull' est juste' git fetch && git merge', plus ou moins, donc au lieu de 'git pull' vous pouvez tester, alors peut-être lancer' git merge'. – torek
@torek Je n'ai pas écrit mes propres commandes Git auparavant; Y a-t-il un bon guide là-bas? –
Il y a beaucoup de * mauvaises * :-) Je ne suis pas vraiment sûr de bonnes. De nombreuses parties de Git sont écrites en tant que scripts shell, cependant. Exécutez 'git --exec-path' et regardez dans l'emplacement résultant, vous trouverez' stash' et 'filter-branch' comme exemples d'énormes scripts shell. J'ajouterai que si vous écrivez un script nommé 'git-foo' et le placez n'importe où dans votre' $ PATH', 'git foo' lancera votre script (avec' git --exec-path' ajouté au début de '$ PATH' pour que vous puissiez'. Git-sh-setup', par exemple). – torek