2011-12-16 4 views
6

J'ai eu un problème avec git. J'ai un dépôt d'un projet qui vieillit et que je veux commencer une nouvelle version. J'ai créé une nouvelle branche (3.0-wip) et supprimé les fichiers et dossiers pour recommencer. Cependant, si je passe en revue ma branche principale, les dossiers et les dossiers sont partis de là aussi. Comment puis-je avoir mon référentiel pour que ma branche maîtresse possède tout ce que le repo distant a, mais un répertoire de travail complètement différent dans mon 3.0-wip que je peux modifier à mon goût sans détruire les fichiers et les dossiers dans une autre branche?Conserver une structure de répertoires différente dans différentes branches git

+0

Avez-vous engager à votre branche 3.0-wip avant de vérifier à votre succursale maître? Sinon, c'est probablement le problème. –

+0

J'ai cloné le repo externe. Création et extraction de la nouvelle branche '3.0-wip'. Fichiers/dossiers supprimés via le Finder. Créé le nouveau fichier 'index.php' et l'a validé. Si je vérifie ma branche 'master' alors les fichiers sont toujours partis, et' git status' montre tous les fichiers/dossiers comme 'deleted:'. –

+1

Avez-vous ajouté git. | git ajouter -u avant votre commit? Comment avez-vous engagé ces changements dans votre branche 3.0-wip? –

Répondre

6

Commité Les modifications dans une branche n'affectent pas une autre branche. Vous devez également valider toutes les suppressions, c'est ce que Dominic a essayé d'expliquer. Faites simplement:

$ git co $NEWBRANCH 
$ git status 

Et vous verrez des zillions de suppressions non validées. Vous devez utiliser git rm pour supprimer des fichiers.
Vous n'êtes pas sûr que git add --all gérera également les suppressions. Quoi qu'il en soit, ce n'est pas la meilleure façon de repartir à zéro car la nouvelle branche aura toujours l'ancienne histoire.

je pense qu'il est préférable de créer un nouveau "disconected" Commit:

  1. Créer une nouvelle prise en pension: mkdir $DIR; cd $DIR; git init
  2. Créer la première validation. touch README; git add --all; git commit -m "Init"

Allez maintenant à Repo d'origine et:

  1. Ajouter comme une télécommande: git remote add start-anew $DIR/.git
  2. vient le chercher: git fetch start-anew
  3. traction dans: git co -b start-anew start-anew/master

Et voila une branche avec l'histoire fraîche et vide.

Vous pouvez ensuite supprimer la télécommande et également changer la télécommande pour la branche. Je suis en train d'éditer .git/config manuellement, jusqu'à présent sans accident.

+0

J'ai essayé de suivre cela, mais quand j'ai essayé d'aller chercher le dépôt 'start-anew', j'ai une erreur 'fatal: l'extrémité distante a raccroché de façon inattendue'. –

+0

Fonctionne avec moi avec 'git version 1.7.6.4'? – Martian

+0

Cela a fonctionné pour moi en poussant le dépôt 'start-anew' vers Github, puis en allant chercher à partir de là. Doit être quelque chose à faire avec essayer d'aller chercher sur ma machine locale. –

8

Qu'est-ce qui se passe, c'est que vous n'utilisez pas git correctement. Il n'y a absolument aucun problème avec la création d'une branche et la suppression de fichiers et de dossiers. Lorsque vous revenez à votre branche principale, les fichiers et dossiers supprimés sont restaurés, car ils n'ont pas été supprimés de cette branche. Qu'est-ce qui se passe dans votre cas, c'est que vous avez supprimé le fichier/dossiers de sous git, en utilisant la suppression du système d'exploitation, plutôt que la commande "git rm". C'est pourquoi l'état git les signale comme "supprimés". C'est aussi pourquoi les fichiers restent supprimés lorsque vous changez de branche. git s'attend à ce que les fichiers soient là et ils ne le sont pas. L'état Git vous demande d'exécuter "git add" mais cela ne fonctionne pas. Puisque le fichier n'est plus là, l'exécution de git add échouera silencieusement. Vous pourriez ne pas remarquer mais le message vous dit aussi de lancer "git rm". Vous pouvez penser que vous ne pouvez pas faire cela puisque le fichier est parti, mais ce n'est pas vrai. La commande rm parviendra toujours à supprimer le fichier du référentiel, même si vous l'avez déjà supprimé du système de fichiers.

L'autre chose que vous pouvez faire est de lancer git add -A. L'indicateur -A dira à ajouter pour remarquer tous les fichiers supprimés ou ajoutés.

Essayez ceci pour un test:

git init test-delete 
cd test-delete 
touch filea 
mkdir dir_b 
touch dir_b/fileb 
git add . 
git commit -m "Initial commit" 
git checkout -b new_branch 
rm -rf dir_b 
git add -A 
git commit -m "deleted files from branch" 
(ls to prove files arent' there) 
git checkout master 
(ls to show files have been restored) 
git checkout new_branch 
(ls to show files are gone again) 
Questions connexes