Je voudrais définir une nouvelle "racine" de la branche dans ce dépôt git. Par "racine" de la branche, je veux dire une branche qui est entièrement indépendante de toutes les autres branches dans le référentiel1.
Malheureusement, même le commit (appelons - A
) à la base de l'opération commit arbre contient beaucoup de fichiers (ce qui était un référentiel qui a été initialisé sur une déjà assez de maturité du projet).
Cela signifie que même si j'ai donné l' A
que la nouvelle branche de l' <start-point>
, cette nouvelle direction ne serait pas démarrer à partir d'une "table rase", mais il contient tous les fichiers qui ont été commis en A
.
Est-il possible que je peux créer complètement une branche nue dans ce référentiel, <start-point>
comme près de A
possible?
1BTW, c'est pas équivalent à la création d'un nouveau repo. Séparer repos serait moins pratique pour un tas de raisons.
EDIT: OK, c'est ce que j'ai fait, basé sur vcsjones' réponse:
# 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 est un peu impliqué, le résultat final est un vide de la base de commettre et qui peuvent servir de <start-point>
pour tout nouveau "rase de la branche"; tout ce que j'avais besoin de faire est de
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
Dans le futur, je vais toujours créer de nouveaux référentiels, comme ceci:
git init
git commit --allow-empty -m 'base commit (empty)'
...de sorte que le premier commit est vide, et toujours disponible pour le démarrage d'une nouvelle branche indépendante. (Ce serait, je le sais, très rarement besoin d'une installation, mais il est tout à fait sans effort de la rendre facilement accessible.)