En git, ¿hay una manera simple de introducir una twig no relacionada a un repository?

Mientras ayudaba a un amigo con un problema de git hoy, tuve que introducir una twig que necesitaba estar totalmente separada de la twig master . El contenido de esta twig realmente tenía un origen diferente de lo que se había desarrollado en la twig master , pero se fusionarían en la twig master más adelante.

Recuerdo haber leído el Git de John Wiegley desde abajo sobre cómo las twigs son esencialmente una label para una confirmación que sigue una cierta convención y cómo una confirmación está ligada a un tree de files y, opcionalmente, a compromisos primarios. Fuimos a crear un compromiso sin padres con el repository existente usando la fontanería de git:

Así que nos deshicimos de todos los files en el índice …

 $ git rm -rf . 

… extrajo directorys y files de un tarball, los agregó al índice …

 $ git add . 

… y creó un object de tree …

 $ git write-tree 

( git-write-tree nos dijo el sha1sum del object de tree creado).

Luego, cometimos el tree, sin especificar los compromisos de los padres …

 $ echo "Imported project foo" | git commit-tree $TREE 

( git-commit-tree nos dijo el sha1sum del object commit creado).

… y creó una nueva twig que apunta a nuestro compromiso recién creado.

 $ git update-ref refs/heads/other-branch $COMMIT 

Finalmente, volvimos a la twig master para continuar trabajando allí.

 $ git checkout -f master 

Esto parece haber funcionado como estaba planeado. Pero este no es el tipo de procedimiento que recomendaría a alguien que recién está comenzando a usar git, por decirlo suavemente. ¿Hay alguna manera más fácil de crear una nueva twig que no esté relacionada con todo lo que ha sucedido en el repository hasta el momento?

Hay una nueva característica (desde V1.7.2) que hace que esta tarea sea un poco más alta que las otras respuestas.

git checkout ahora es compatible con la opción --orphan . Desde la página man :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

Cree una nueva sucursal huérfana , denominada <new_branch>, iniciada desde <start_point> y cambie a ella. El primer compromiso realizado en esta nueva twig no tendrá padres y será la raíz de una nueva historia totalmente desconectada de todas las otras twigs y compromisos.

Esto no hace exactamente lo que quería el asker, porque rellena el índice y el tree de trabajo desde <start_point> (ya que, después de todo, es un command de extracción). La única otra acción necesaria es eliminar los elementos no deseados del tree de trabajo y el índice. Desafortunadamente, git reset --hard no funciona, pero git rm -rf . se puede usar en su lugar (creo que esto es equivalente a rm .git/index; git clean -fdx dado en otras respuestas).


En resumen:

 git checkout --orphan newbranch git rm -rf . <do work> git add your files git commit -m 'Initial commit' 

Dejé <start_point> no especificado porque su valor pnetworkingeterminado es HEAD, y realmente no nos importa. Esta secuencia hace esencialmente lo mismo que la secuencia de commands en la respuesta de Artem , simplemente sin recurrir a los commands de plomería de miedo.

Del libro comunitario de Git :

 git symbolic-ref HEAD refs/heads/newbranch rm .git/index git clean -fdx <do work> git add your files git commit -m 'Initial commit' 

Aunque la solución con git symbolic-ref y remove index funciona, podría ser conceptualmente más limpio crear un nuevo repository

 $ cd /path/to/unrelated $ git init [edit and add files] $ git add . $ git commit -m "Initial commit of unrelated" [master (root-commit) 2a665f6] Initial commit of unrelated 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo 

luego searchlo

 $ cd /path/to/repo $ git fetch /path/to/unrelated master:unrelated-branch warning: no common commits remote: Counting objects: 3, done. Unpacking objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) From /path/to/unrelated * [new branch] master -> unrelated-branch 

Ahora puede eliminar / path / to / unrelated

Github tiene una característica llamada Project Pages donde puedes crear una twig con nombre particular en tu proyecto para proporcionar files que serán servidos por Github. Sus instrucciones son las siguientes:

 $ cd /path/to/fancypants $ git symbolic-ref HEAD refs/heads/gh-pages $ rm .git/index $ git clean -fdx 

A partir de ahí, tiene un repository vacío al que puede agregar su nuevo contenido.

La respuesta seleccionada actualmente es correcta, solo agregaría eso casualmente …

Así es exactamente cómo github.com permite a los usuarios crear páginas Github para sus repositorys, a través de una sucursal huérfana llamada gh-pages . Los pasos bonitos se dan y explican aquí:

https://help.github.com/articles/creating-project-pages-manually

¡Espero que esto ayude!

A veces solo quiero crear una twig vacía en el proyecto al instante y luego comenzar a trabajar, solo ejecutaré el siguiente command:

 git checkout --orphan unrelated.branch.name git rm --cached -r . echo "init unrelated branch" > README.md git add README.md git commit -m "init unrelated branch" 

Encontré este script en http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches y funciona muy bien.

 #!/bin/bash set -e if test -z "$2" -o -n "$3"; then echo "usage: $0 REPO BRANCHNAME" >&2 exit 1 fi repo=$1 branch=$2 git fetch "$repo" "$branch" head=$(git rev-parse HEAD) fetched=$(git rev-parse FETCH_HEAD) headref=$(git rev-parse --symbolic-full-name HEAD) git checkout $fetched . tree=$(git write-tree) newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched) git update-ref $headref $newhead $head git reset --hard $headref