Dans git, existe-t-il un moyen simple d’introduire une twig non associée dans un référentiel?

Tout en aidant un ami avec un problème git aujourd’hui, j’ai dû introduire une twig qui devait être totalement séparée de la twig principale. Le contenu de cette twig avait une origine différente de ce qui avait été développé sur la twig principale, mais ils allaient être fusionnés ultérieurement dans la twig master .

Je me suis souvenu de lire Git de John Wiegley de bas en haut comment les twigs sont essentiellement un label pour un commit qui suit une convention donnée et comment un commit est lié à une arborescence de fichiers et, éventuellement, à une validation par un parent. Nous sums allés créer un engagement sans parent dans le référentiel existant en utilisant la plomberie de git:

Nous avons donc éliminé tous les fichiers de l’index …

 $ git rm -rf . 

… extrait des répertoires et des fichiers d’une archive, ajouté ceux à l’index …

 $ git add . 

… et créé un object arbre …

 $ git write-tree 

( git-write-tree nous a dit le sha1sum de l’object d’arbre créé.)

Ensuite, nous avons engagé l’arbre, sans spécifier le commit parent …

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

( git-commit-tree nous a dit le sha1sum de l’object commit créé.)

… et a créé une nouvelle twig qui pointe vers notre commit nouvellement créé.

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

Enfin, nous sums retournés à la twig principale pour continuer à travailler là-bas.

 $ git checkout -f master 

Cela semble avoir fonctionné comme prévu. Mais ce n’est clairement pas le genre de procédure que je recommanderais à quelqu’un qui commence à utiliser git, c’est le moins que l’on puisse dire. Existe-t-il un moyen plus facile de créer une nouvelle twig qui n’a aucun lien avec tout ce qui s’est passé jusqu’ici dans le référentiel?

Il y a une nouvelle fonctionnalité (depuis la version 1.7.2) qui rend cette tâche un peu plus compliquée que dans les autres réponses.

git checkout prend désormais en charge l’option --orphan . De la page de manuel :

git checkout [-q] [-f] [-m] --orphan []

Créez une nouvelle twig orpheline nommée , démarrée à partir de et activez-la. Le premier commit effectué sur cette nouvelle twig n’aura pas de parents et ce sera la racine d’un nouvel historique totalement déconnecté de toutes les autres twigs et validations.

Cela ne correspond pas exactement à ce que le demandeur voulait, car il remplit l’index et l’arborescence de travail à partir de (puisqu’il s’agit, après tout, d’une commande d’extraction). La seule autre action nécessaire consiste à supprimer les éléments indésirables de l’arborescence et de l’index. Malheureusement, git reset --hard ne fonctionne pas, mais git rm -rf . peut être utilisé à la place (je pense que cela équivaut à rm .git/index; git clean -fdx donné dans d’autres réponses).


En résumé:

 git checkout --orphan newbranch git rm -rf .  git add your files git commit -m 'Initial commit' 

Je spécifié parce que HEAD était par défaut, et nous ne nous en soucions pas vraiment. Cette séquence fait essentiellement la même chose que la séquence de commande dans la réponse d’Artem , sans avoir recours à des commandes de plomberie effrayantes.

De Git Community Book :

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

Bien que la solution avec git symbolic-ref et remove index fonctionne, il peut être conceptuellement plus propre de créer un nouveau référentiel

 $ 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 

puis en chercher

 $ 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 

Maintenant, vous pouvez supprimer / path / to / unrelated

Github a une fonctionnalité appelée Project Pages dans laquelle vous pouvez créer une twig nommée particulière dans votre projet pour fournir des fichiers qui seront servis par Github. Leurs instructions sont les suivantes:

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

De là, vous avez un référentiel vide que vous pouvez ensuite append à votre nouveau contenu.

La réponse actuellement sélectionnée est correcte, je voudrais juste append cela par hasard …

C’est en fait exactement ce que github.com permet aux utilisateurs de créer des pages Github pour leurs repositorys, grâce à une twig orpheline appelée gh-pages . Les jolies étapes sont données et expliquées ici:

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

J’espère que cela t’aides!

Parfois, je veux juste créer une twig vide dans le projet immédiatement, puis commencer à travailler, je ne ferai qu’exécuter la commande suivante:

 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" 

J’ai trouvé ce script sur http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-twigs et ça marche très 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 

Si votre contenu existant était déjà engagé, vous (Git 2.18 Q2 2018) pouvez maintenant l’extraire dans sa nouvelle twig orpheline, car l’implémentation de ” git rebase -i --root ” a été mise à jour pour utiliser davantage la machine séquenceur.

Ce séquenceur est celui qui permet maintenant de transplanter toute la topologie du graphe de validation ailleurs .

Voir commit 8fa6eea , commettre 9c85a1c , valider ebddf39 , valider 21d0764 , valider d87d48b , valider ba97aea (03 mai 2018) par Johannes Schindelin ( dscho ) .
(Fusion par Junio ​​C Hamano – gitster – dans commit c5aa4bc , 30 mai 2018)

séquenceur: permet d’introduire de nouveaux commits racine

Dans le contexte du nouveau mode --rebase-merges , conçu spécifiquement pour permettre la modification --rebase-merges de la topologie de twig existante, un utilisateur peut vouloir extraire des commits dans une toute nouvelle twig qui commence par un commit racine nouvellement créé .

Ceci est maintenant possible en insérant la commande reset [new root] avant de pick le commit qui veut devenir un commit racine. Exemple:

 reset [new root] pick 012345 a commit that is about to become a root commit pick 234567 this commit will have the previous one as parent 

Cela n’entre pas en conflit avec les autres utilisations de la commande reset car [new root] n’est pas (une partie de) un nom de référence valide: à la fois le crochet d’ouverture et l’espace sont illégaux dans les noms de référence.