Je suis nouveau dans ce groupe, j'utilise git depuis 2 ans au boulot,
et j'ai même assisté à une conf de @sdouche :-)
En clonant un dépôt SVN avec la commande git-svn, j'obtiens une
"branche orpheline" suite un un tag SVN mal placé. Le problème est que
cette "branche" contient beaucoup de contenu que git-svn n'a pas pu
relier au contenu de la branche master, il y a donc des tas de
dossiers/fichiers qui ne servent à rien.
Je voudrais effacer cette branche, avec tout ses commits ainsi que le
contenu stocké. (je remettrais les tags à la main)
Je sais effacer une branche (git branch -D toto) mais ca n'efface pas
les commits, ni le contenu stocké. Et je peux toujours retrouver ma
branche avec un git checkout -b toto 123abc
Un "git gc" et/ou "git prune" ne change rien, je peux toujours
retrouver mes petits.
Je pensais que si la "branche" n'était plus référencée, git l'effaçait
automatiquement. Mais comment le forcer à l'effacer et surtout comment
être sûr que tout à disparu?
Même en clonant mon dépôt local sans aucune référence à cette branche,
je peux toujours la retrouver avec le SHA1.
Quelqu'un a une idée sur comment me débarrasser de cette sacré
branche?
> Je suis nouveau dans ce groupe, j'utilise git depuis 2 ans au boulot, > et j'ai même assisté à une conf de @sdouche :-)
Whaou. Tu es donc un padawan niveau 3 !
> En clonant un dépôt SVN avec la commande git-svn, j'obtiens une > "branche orpheline" suite un un tag SVN mal placé.
Je présume que ce que tu appelles branche "orpheline" est une branche sans relation avec le reste des branches, sans ancêtre commun.
> Je sais effacer une branche (git branch -D toto) mais ca n'efface pas > les commits, ni le contenu stocké.
Etrange. Une fois cette commande effectuée, tu vois toujours ta branche ? Ok. Notes le SHA1 du commit HEAD (nommé sha1_toto ci après de la branche toto, puis dis moi ce que tu donnes un : $ git branch -D toto $ git show-ref $ git name-rev <sha1_toto> $ git describe <sha1_toto>
Et en plus lances gitk : $ gitk --all
Vois tu toujours tes commits ? Si oui, y'a t'il une référence quelconque (tag, branche) sur ces commits ?
> Et je peux toujours retrouver ma > branche avec un git checkout -b toto 123abc
Ah ça c'est normal :). Si tu remets une référence, tes commits réviennent.
> Je pensais que si la "branche" n'était plus référencée, git l'effaçait > automatiquement.
Nop, elle est effacée quand le garbage collector passe, ce qui permet de la récupérer en cas d'erreur.
> Même en clonant mon dépôt local sans aucune référence à cette branche, > je peux toujours la retrouver avec le SHA1.
Toujours normal, tant que le gc ne passe pas.
> Quelqu'un a une idée sur comment me débarrasser de cette sacré > branche?
Ma 1ere impression (qui peut être fausse) c'est que tu effaces bien ta branche, mais tu crois encore l'avoir. Effacer une branche avec Git signifie juste enlever la référence de type branche.
> 2011/7/31 Julien Catalano <julien.catal...@gmail.com>: >> Je sais effacer une branche (git branch -D toto) mais ca n'efface pas >> les commits, ni le contenu stocké.
> Etrange. Une fois cette commande effectuée, tu vois toujours ta > branche ? Ok. Notes le SHA1 du commit HEAD (nommé sha1_toto ci après > de la branche toto, puis dis moi ce que tu donnes un : > $ git branch -D toto > $ git show-ref > $ git name-rev <sha1_toto> > $ git describe <sha1_toto>
> Et en plus lances gitk : > $ gitk --all
Effectivement, quand j'efface ma branche, je ne la *vois* plus dans gitk, et les commandes précédentes ne me donnent rien de signifiant (ma branche a bien disparue). Mais je sais qu'elle est encore là puisque je peux la retrouver.
>> Et je peux toujours retrouver ma >> branche avec un git checkout -b toto 123abc
> Ah ça c'est normal :). Si tu remets une référence, tes commits réviennent.
>> Je pensais que si la "branche" n'était plus référencée, git l'effaçait >> automatiquement.
> Nop, elle est effacée quand le garbage collector passe, ce qui permet > de la récupérer en cas d'erreur.
C'est bien là que se situe mon problème. J'efface ma branche, elle disparaît dans gitk, je lance git gc, et même git gc --agressive, mais rien n'y fait, elle revient toujours quand je fais un checkout avec son SHA1.
Je voudrais faire disparaître cette branche de mon historique, mais aussi et surtout le *contenu* qu'elle référence avec elle. Est-ce possible? Est-ce que git-gc est la commande à utiliser? Je peux mettre le dépôt à disposition si nécessaire (c'est du code GPL).
Le 2 août 2011 00:26, Julien Catalano <julien.catal...@gmail.com> a écrit :
> C'est bien là que se situe mon problème. J'efface ma branche, elle > disparaît dans gitk, je lance git gc, et même git gc --agressive, mais > rien n'y fait, elle revient toujours quand je fais un checkout avec > son SHA1.
> man git gc : > --prune=<date> Prune loose objects older than date (default is 2 weeks ago)
Merci à Camille qui m'a devancée (bon, je fais genre je savais, en vrai je n'ai jamais matté la doc de git-gc). Et hop, ca va faire une nouvelle astuce sur le blog !
>> man git gc : >> --prune=<date> Prune loose objects older than date (default is 2 weeks ago)
> Merci à Camille qui m'a devancée (bon, je fais genre je savais, en > vrai je n'ai jamais matté la doc de git-gc). Et hop, ca va faire une > nouvelle astuce sur le blog !
Je viens d'essayer, mais toujours le même résultat: la branche disparaît mais je peux toujours la retrouver en faisant un checkout sur son SHA1.
Je vois vraiment pas quoi faire de plus. Je me demande si le fait que ce soit une branche orpheline n'influence pas le comportement de git gc.
Bon j'ai pris 10mn pour comprendre ce problème fort intéressant. En fait, tes objets ne sont pas effacés car ils sont toujours référencés par le reflog. Si tu fais ceci, ça doit être bon : $ git reflog expire --expire=now --all $ git gc --aggressive --prune=now
Quand tu effaces une branche tu effaces le reflog associé (logique), mais pas le reflog HEAD. Donc les sha1 existent toujours dans le système. C'est pour ça que la doc de git-gc parle autant de reflog.
Note : les repos partagés (--bare) n'ont pas de reflog, donc il suffit d'effacer pour que les commits disparaissent.