Je voudrais définir une nouvelle branche "racine" dans ce dépôt git. Par branche "racine", j'entends une branche qui est entièrement indépendante de toutes les autres branches du référentiel 1 .
Malheureusement, même le commit (appelons-le A
) à la base même de l'arborescence de commit du dépôt contient beaucoup de fichiers (il s'agissait d'un dépôt initialisé sur un projet déjà assez mature).
Cela signifie que même si je donnais A
comme nouvelle branche <start-point>
, cette nouvelle branche ne partirait pas d'une "table rase", mais contiendrait plutôt tous les fichiers qui ont été validés A
.
Existe-t-il un moyen de créer une branche complètement nue dans ce référentiel, avec le <start-point>
plus près A
possible?
1 BTW, c'est n'équivaut pas à créer un nouveau repo. Des dépôts séparés seraient moins pratiques pour de nombreuses raisons.
EDIT : OK, c'est ce que j'ai fait, basé sur la réponse de 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
Bien que cette procédure soit un peu compliquée, le résultat final est un commit de base vide qui peut servir de <start-point>
pour toute nouvelle "branche propre"; tout ce que je devrais faire alors c'est
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
À l'avenir, je créerai toujours de nouveaux référentiels comme celui-ci:
git init
git commit --allow-empty -m 'base commit (empty)'
... pour que le premier commit soit vide , et toujours disponible pour démarrer une nouvelle branche indépendante. (Ce serait, je sais, une installation très rarement nécessaire, mais il est assez facile de la rendre facilement disponible.)
git rebase --onto
, voir stackoverflow.com/questions/645450/...