2017-06-01 10 views
0

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.

+0

'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

+0

@torek Je n'ai pas écrit mes propres commandes Git auparavant; Y a-t-il un bon guide là-bas? –

+0

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

Répondre

1

J'ai besoin en plus de faire un git pull dans les projets que je ne suis pas la construction afin qu'ils aient la dernier code ... Malheureusement, cela fonctionne également git pull sur les projets que je suis en train de faire des modifications sur

Vous pouvez exécuter git pull --ff-only, qui échoue immédiatement s'il existe des validations locales.

+0

J'aurais vraiment dû y penser moi-même et je ne sais pas pourquoi je ne l'ai pas fait. Il ne fait toujours pas exactement ce que j'ai demandé, mais c'est assez proche et je pense qu'il fait ce que je veux réellement. –

+0

Ce n'était pas si simple: j'utilise pull-with-rebase par défaut parce que le rebasage est attendu là où je travaille, et j'avais besoin d'ajouter '-c rebase.autoStash = no' à la ligne de commande - mais maintenant ça fonctionne exactement comme je le voulais, et je peux faire un alias qui fait le fetch et ça en même temps. –

0

Vous pouvez commencer à utiliser des crochets git et exécuter

git fetch -a 

tout temps, il est nécessaire

+0

Aucun des hooks ne semble être exécuté sur fetch, à moins que ceux qui s'exécutent sur push à distance fonctionnent aussi sur fetch local mais je ne le vois pas documenté nulle part. –