Le Moyen Le Plus Facile™
Il s'avère que c'est un tel courantes et les plus utiles à la pratique que les seigneurs de git fait-il vraiment facile, mais vous devez avoir une version plus récente de git (>= 1.7.11 Mai 2012). Voir l' annexe pour savoir comment installer la dernière git. Aussi, il y a un exemple réel dans la procédure pas à pas ci-dessous.
-
Préparer le vieux repo
pushd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
popd
Remarque: <name-of-folder>
ne doit PAS contenir de tête ou en queue de caractères. Par exemple, le dossier nommé subproject
DOIT être passé en subproject
, PAS ./subproject/
-
Créer le nouveau repo
mkdir <new-repo>
pushd <new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
-
Lien de la nouvelle repo à Github ou partout où
git remote add origin <git@github.com:my-user/new-repo.git>
git push origin -u master
-
Nettoyage, si désiré
popd # get out of <new-repo>
pushd <big-repo>
git rm -rf <name-of-folder>
Note: Ceci laisse toutes les références historiques dans le référentiel.Voir l' Annexe ci-dessous si vous êtes réellement inquiète d'avoir commis un mot de passe ou vous avez besoin de la diminution de la taille du fichier .git
le dossier.
...
Procédure pas à pas
Ce sont les mêmes étapes que ci-dessus, mais à la suite de ma étapes exactes pour mon dépôt au lieu d'utiliser <meta-named-things>
.
Voici un projet que j'ai pour la mise en œuvre de JavaScript navigateur modules node:
tree ~/Code/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Je veux diviser un seul dossier, btoa
, dans un dépôt git
pushd ~/Code/node-browser-compat/
git subtree split -P btoa -b btoa-only
popd
J'ai maintenant une nouvelle direction, btoa-only
, qui n'a que des commits btoa
et je veux créer un nouveau référentiel.
mkdir ~/Code/btoa/
pushd ~/Code/btoa/
git init
git pull ~/Code/node-browser-compat btoa-only
Ensuite, j'ai créer un nouveau repo Github ou bitbucket, ou que ce soit et d'ajouter que c'est l' origin
(btw, "origine" n'est qu'une convention, ne fait pas partie de la commande - vous pouvez l'appeler "remote-server" ou ce que vous voulez)
git remote add origin git@github.com:node-browser-compat/btoa.git
git push origin -u master
Heureux jour!
Remarque: Si vous avez créé un repo avec un README.md
, .gitignore
et LICENSE
, vous aurez besoin pour tirer d'abord:
git pull origin -u master
git push origin -u master
Enfin, je vais vouloir supprimer le dossier de la plus grande repo
git rm -rf btoa
...
Annexe
Dernière git sur OS X
Pour obtenir la dernière version de git:
brew install git
Pour obtenir de l'infusion pour OS X:
http://brew.sh
Dernière git sur Ubuntu
sudo apt-get update
sudo apt-get install git
git --version
Si cela ne fonctionne pas (vous avez une très vieille version d'ubuntu), essayez de
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Si cela ne fonctionne toujours pas, essayez de
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
Merci à rui.araujo, les commentaires.
la suppression de votre histoire
Par défaut, la suppression de fichiers à partir de git n'a pas fait les supprimer à partir de git, c'est juste s'engage à ce que ils ne sont pas plus là. Si vous souhaitez réellement supprimer les références historiques (ex: vous avez engagé un mot de passe), vous devez faire ceci:
git filter-branch --tree-filter 'rm -rf <name-of-folder>' HEAD
Après cela, vous pouvez vérifier que votre fichier ou de dossier ne s'affiche plus dans l'historique de git à tous
git log -S<name-of-folder> # should show nothing
Cependant, vous ne pouvez pas "pousser" les suppressions à github et la comme. Si vous essayez, vous recevrez un message d'erreur et vous devrez git pull
avant git push
- et puis vous êtes de retour pour avoir tout dans votre histoire.
Donc, si vous voulez supprimer l'historique de "l'origine" - dans le sens de supprimer à partir de github, bitbucket, etc - vous aurez besoin de supprimer les pensions de titres et de re-pousser un taillés copie du repo. Mais attendez - il y a plus! - Si vous êtes vraiment préoccupés par se débarrasser d'un mot de passe ou quelque chose comme cela, vous aurez besoin de tailler la sauvegarde (voir ci-dessous).
rendant .git
plus petit
Ladite supprimer l'historique de commande laisse toujours derrière un tas de fichiers de sauvegarde - parce que git est trop aimable à vous aider à ne pas ruiner votre repo par accident. Il sera finalement supprimé les fichiers orphelins au cours des jours et des mois, mais il les laisse là pendant un certain temps dans le cas où vous vous rendez compte que vous avez accidentellement supprimé quelque chose que vous ne voulez pas.
Donc, si vous voulez vraiment vider la corbeille pour réduire le clone de la taille d'une mise en pension immédiatement que vous avez à faire tout cela vraiment des choses bizarres:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
Cela dit, je vous recommande de ne pas effectuer ces étapes, sauf si vous savez que vous avez besoin d' - juste au cas où vous ne taillez le mauvais sous-répertoire, tu sais? Les fichiers de sauvegarde ne devrait pas avoir cloné lorsque vous appuyez sur le repo, il va juste être dans votre copie locale.
Crédit