Repository navigation
fix: refuse to remove a worktree with live processes - #44
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Trois défauts trouvés en utilisant l'outil, pas en le relisant. Tous les trois dans des commandes quotidiennes.
1.
gwt rmpouvait à moitié supprimer un worktree — et ne savait plus finirAvec des serveurs de dev encore vivants,
git worktree removesupprime les fichiers pendant que les processus en réécrivent. Lermdirfinal échoue, mais git a déjà désenregistré le worktree. La commande relancée répond alors :et le dossier à moitié vidé ne peut plus être nettoyé que par un
rm -rfmanuel.Observé en conditions réelles : 51 processus vivants, 144 Ko d'orphelins laissés sur le disque — dont le
CLAUDE.mdet l'eslint.config.mjsdu dépôt.Correctif.
rmcherche d'abord les processus tournant sous le worktree. Dans un terminal il les nomme et propose de les arrêter (SIGTERM, puis SIGKILL pour les récalcitrants) ; sans terminal il refuse et affiche lepkillà lancer.--forcene l'outrepasse pas volontairement : il veut dire « l'arbre est sale et je le sais », pas « supprime les fichiers sous un serveur qui tourne ». C'est précisément avec--forceque le dégât s'est produit.La détection passe par
pgrep -fsur le chemin du worktree — un serveur démarré là porte le chemin dans son argv. Le motif est échappé pour l'ERE, sans quoi un worktreerelease/1.0.0matcherait des chemins qui ne sont pas les siens.2. Une branche créée avec
--fromhéritait de la base comme upstreamgit worktree add -b fix/x <path> origin/mainconfigureorigin/mainen upstream. Ungit pushnu échoue alors ainsi :Copiez cette suggestion un après-midi de fatigue et le correctif atterrit sur la branche par défaut. Sur un flux de tickets de support, c'est inacceptable.
--frompasse maintenant--no-track, et le mêmegit pushsuggèregit push --set-upstream origin fix/x.3.
--frompartait d'une base périméeaddne faisait unfetchque si la branche existait déjà :Donc
--from mainsur une branche neuve utilisait la ref locale telle quelle — potentiellement vieille de plusieurs semaines, sans un mot. Le nouveaufetchBaserafraîchit la contrepartie distante, et quand une base locale est en retard sur son remote il dit de combien de commits et suggère--from origin/<base>.Tests
172 tests (+7). Chacun vérifié rouge sans son correctif, en neutralisant l'appel dans le build :
Le test du fetch fait pousser un commit par un second clone entre-temps, puis vérifie qu'il est bien dans le worktree créé — c'est la course réelle, pas une simulation.