web-dev-qa-db-fra.com

'<Branch>' est déjà extrait à '</ other/location>' dans les arborescences git

J'ai commencé à utiliser les arbres de travail git. Cela semble fonctionner, mais j'obtiens cette erreur en essayant de vérifier une branche dans l'arbre de travail cloné:

fatal: '<branch>' is already checked out at '</other/location>'

Comment résoudre ce problème sans supprimer le répertoire .git/worktrees?

17
Harald Nordgren

Git ne vous laissera pas vérifier la même branche deux fois, parce que si vous le faites, puis allez dans l'un des deux arbres de travail et faites un nouveau commit, vous vous exposerez à la misère quand vous reviendrez au autre arbre de travail.

Si vous avez réellement supprimé l'autre arbre de travail, exécutez simplement git worktree Prune pour que Git s'en rende compte. Si vous avez non réellement supprimé l'autre arbre de travail, ne le vérifiez pas deux fois: ce n'est pas amusant.

17
torek

Comment résoudre ce problème sans supprimer le répertoire .git/worktrees?

Vous aurez plus de facilité avec Git 2.17+ (T2 2018), car "git worktree" a appris les sous-commandes "move" et "remove".

Voir commit 7f19def (04 mars 2018) de Eric Sunshine (sunshineco) .
Voir commit ee6763a , commit cc73385 , commit 78d986b , commit c64a8d2 , commit 9f792bb , commit 9c620fc (12 fév 2018) et commit 4ddddc1 (24 janvier 2018) de Nguyễn Thái Ngọc Duy (pclouds) .
(Fusion par Junio ​​C Hamano - gitster - in commit bd0f794 , 14 mars 2018)

Dans votre cas, vous pouvez déplacer l'arborescence existante vers l'emplacement souhaité (lors de la tentative de création d'une nouvelle arborescence pour la même branche).

worktree move: nouvelle commande

Cette commande permet de déplacer des arbres de travail liés.
L'arbre de travail principal ne peut pas (encore) être déplacé.

Et:

worktree move: refuser de déplacer des arbres de travail avec des sous-modules

Les sous-modules contiennent des fichiers .git avec des chemins relatifs.
Après un worktree move, ces fichiers doivent être mis à jour ou ils risquent de ne pointer nulle part.

Ceci est un correctif de bandage pour s'assurer que "worktree move" ne casse pas les arbres de travail des gens par accident.
Lorsque le code de mise à jour du fichier .git est en place, cette validate_no_submodules() peut être supprimée.


Remarque: avant Git 2.21 (T1 2019), "git worktree remove" et "git worktree move" refusaient de fonctionner lorsqu'un sous-module était impliqué.
Ceci a été desserré pour ignorer les sous-modules non initialisés .

2
VonC

Notez que cela se produit également si votre $pwd contient des liens. git devrait probablement readlink -f sur le $pwd avant de vérifier.

Edit: Ou bien c'est peut-être parce que j'ai manqué d'appeler git worktree Prune. Maintenant ça marche.

0
Sebastian Graf

Allez simplement dans le répertoire worktree de votre branche désirée, et automatiquement checkout pour vous.

Dans mon cas, j'ai deux worktree de longue durée, ce qui signifie deux branches pertinentes à côté de master.

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

Il y a un référentiel, mais j'ai 3 dossiers séparés les uns à côté des autres pour chaque branche ci-dessus. Et effectuez les modifications courantes dans master. puis le fusionner avec les deux autres versions. 

Les modifications spécifiques de chaque version seront également placées dans le dossier correspondant. Les travaux de chaque projet sont isolés et IDE ne doit pas être confondu.

J'espère que cela pourra aider.

0
vaheeds

Étant donné que vous ne pouvez pas extraire deux fois l’arbre de travail et le référentiel original Que diriez-vous de commander un dépôt original ailleurs avant de passer à la caisse de travail?

git -C </other/location> checkout <branch>~1
git -C <worktree> checkout <branch>
0
Ramius