Vorrei definire un nuovo ramo "root" in questo repository git. Per ramo "radice" intendo un ramo che è completamente indipendente da tutti gli altri rami nel repository 1 .
Sfortunatamente, anche il commit (chiamiamolo così A
) alla base dell'albero di commit del repository contiene molti file (questo era un repository inizializzato su un progetto già abbastanza maturo).
Ciò significa che anche se avessi dato A
come nuovo ramo <start-point>
, questo nuovo ramo non sarebbe partito da una "lavagna pulita", ma piuttosto conterrebbe tutti i file in cui è stato eseguito il commit A
.
Esiste un modo per creare un ramo completamente nudo in questo repository, con il <start-point>
più vicino A
possibile?
1 A proposito, questo non equivale alla creazione di un nuovo repository. Repos separati sarebbero meno convenienti per molte ragioni.
EDIT : OK, questo è quello che ho fatto, in base alla risposta di vcsjones :
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
Sebbene questa procedura sia un po 'complicata, il risultato finale è un commit di base vuoto che può fungere da <start-point>
per ogni nuovo "ramo clean-slate"; tutto ciò che dovrei fare allora è
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
In futuro creerò sempre nuovi repository come questo:
git init
git commit --allow-empty -m 'base commit (empty)'
... in modo che il primo commit sia vuoto e sempre disponibile per l'avvio di una nuova filiale indipendente. (Questo sarebbe, lo so, una struttura molto raramente necessaria, ma è abbastanza facile renderlo facilmente disponibile.)
git rebase --onto
, vedere stackoverflow.com/questions/645450/...