ti-enxame.com

Como criar um novo (e vazio!) Ramo "raiz"?

Eu gostaria de definir um novo ramo "raiz" neste repositório git. Por ramo "raiz", quero dizer um ramo que é totalmente independente de todos os outros ramos no repositório1 1.

Infelizmente, mesmo o commit (vamos chamá-lo A) na base da árvore de commit do repositório contém muitos arquivos (este foi um repositório que foi inicializado em um projeto já bastante maduro).

Isso significa que, mesmo se eu desse A como o novo ramo <start-point>, esse novo ramo não seria iniciado a partir de uma "lista limpa", mas conteria todos os arquivos confirmados em A.

Existe alguma maneira de criar uma ramificação completamente vazia neste repositório, com <start-point> o mais próximo possível de A?


1 1BTW, isso é não equivalente à criação de um novo repositório. Os repositórios separados seriam menos convenientes por vários motivos.


EDIT: OK, foi o que eu fiz, com base em vcsjones 'resposta:

# 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

Embora esse procedimento esteja um pouco envolvido, o resultado final é um commit base vazio base que pode servir como o <start-point> para qualquer novo "ramo limpo"; tudo o que eu preciso fazer então é

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

No futuro, sempre criarei novos repositórios como este:

git init
git commit --allow-empty -m 'base commit (empty)'

... para que o primeiro commit seja vazio, e sempre disponível para iniciar um novo ramo independente. (Sei que seria uma instalação muito raramente necessária, mas é muito fácil torná-la prontamente disponível.)

115
kjo

Use --Orphan ao criar a ramificação:

git checkout --Orphan YourBranchName

Isso criará uma nova ramificação com zero confirmações, no entanto, todos os seus arquivos serão testados. Nesse ponto, você pode apenas removê-los.
("remova-os": A git reset --hard esvaziará o índice, deixando você com uma árvore de trabalho vazia)

Dê uma olhada no página de manual para finalizar a compra para obter mais informações sobre --Orphan.

195
vcsjones

Para adicionar à resposta aceita - prática recomendada reverter para o estado limpo é criar ma confirmação vazia inicial para que você possa se recuperar facilmente enquanto configura suas ramificações para a posteridade. Além disso, como você deseja um estado limpo, é provável que você tenha confirmado arquivos que não deveria, então você deve removê-los do índice. Com isso em mente, você deve:

$ git checkout --Orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit
6
Mr_and_Mrs_D