Rimuovere refs / original / heads / master dal repository git dopo filtro-ramo - filtro-albero?


180

Ho avuto la stessa domanda posta qui: Nuovo repository git nella directory principale per sottoporre un repository esistente in una sottodirectory

Ho seguito questa risposta qui: Nuovo repository git nella directory principale per seguire un repository esistente in una sottodirectory

Ora gitk --allmostra due storie: una che culmina nella corrente mastere una che prende il nome original/refs/heads/master.

Non so quale sia questa seconda storia o come rimuoverla dal repository. Non ho bisogno di due storie nel mio repository.

Come posso liberarmene?

Per riprodurti:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'

Ora abbiamo il problema del poster originale. Spostiamo la radice del repository git in project-root usando la risposta collegata sopra:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard

Ora, vedi il mio problema attuale:

gitk --all &
git show-ref

Come mi libero di refs/original/heads/mastere tutta la storia associata?


Risposte:


321

refs/original/*è disponibile come backup, nel caso in cui si incasini il ramo del filtro. Credetemi, è davvero una buona idea.

Dopo aver esaminato i risultati e sei molto sicuro di avere ciò che desideri, puoi rimuovere il riferimento di backup:

git update-ref -d refs/original/refs/heads/master

o se hai fatto questo a molti ref, e vuoi cancellare tutto:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(Viene preso direttamente dalla manpage del ramo filtro.)

Questo non si applica a te, ma agli altri che potrebbero trovarlo: se esegui un ramo filtro che rimuove il contenuto occupando spazio su disco significativo, potresti anche voler eseguire git reflog expire --expire=now --alle git gc --prune=nowfar scadere i tuoi reflog ed eliminare gli oggetti ora inutilizzati . (Attenzione: completamente, totalmente irreversibile. Assicurati molto prima di farlo.)


Dopo aver eseguito update-ref, reflog expire e gc, entrambi questi file fanno ancora riferimento al ref originale: .git / info / refs e .git / pacchetto-refs Sembra che forse dovrebbe dire questo invece:git update-ref -d refs/original/refs/heads/master
lhunath,

1
Immagino che tu abbia accidentalmente mescolato le parole: se ho ragione, dovrebbe essere git update-ref -d original/refs/heads/master? Tuttavia, solo il tuo secondo comando ha funzionato per me.
JJD,

4
È a git update-ref -d refs/original/refs/heads/masterproposito. Puoi vedere il nome completo usando git show-ref.
colpì il

4
E il più corto git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB,

11

E se sei in Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }

7

filter-branchmantiene i backup, quindi il repository deve ripulire i reflog e garbage collection. Assicurarsi che non siano necessari in questi backup prima dell'eliminazione:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.