The Easy Way ™
Il s'avère que c'est une pratique tellement courante et utile que les suzerains de Git ont rendu les choses vraiment faciles, 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 version de Git. En outre, il y a un exemple réel dans la procédure pas à pas ci-dessous.
Préparer l'ancien repo
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
Remarque: ne <name-of-folder>
doit PAS contenir de caractères de début ou de fin. Par exemple, le dossier nommé subproject
DOIT être transmis en tant que subproject
, PAS./subproject/
Remarque pour les utilisateurs de Windows: lorsque la profondeur de votre dossier est> 1, vous <name-of-folder>
devez avoir un séparateur de dossier de style * nix (/). Par exemple, le dossier nommé path1\path2\subproject
DOIT être transmis commepath1/path2/subproject
Créer le nouveau référentiel
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
Liez le nouveau dépôt à GitHub ou n'importe où
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
Nettoyage à l'intérieur <big-repo>
, si désiré
git rm -rf <name-of-folder>
Remarque : Cela laisse toutes les références historiques dans le référentiel.Voir l' annexe ci-dessous si vous êtes réellement inquiet d'avoir validé un mot de passe ou si vous devez réduire la taille du fichier de votre .git
dossier.
...
Procédure pas à pas
Ce sont les mêmes étapes que ci - dessus , mais en suivant mes étapes exactes pour mon référentiel au lieu d'utiliser <meta-named-things>
.
Voici un projet que j'ai pour implémenter des modules de navigateur JavaScript dans le nœud:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Je souhaite diviser un dossier unique btoa
en un référentiel Git séparé
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
J'ai maintenant une nouvelle branche, btoa-only
qui n'a que des commits btoa
et je veux créer un nouveau dépôt.
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
Ensuite, je crée un nouveau dépôt sur GitHub ou Bitbucket, ou autre chose et l'ajoute comme origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
Bonne journée!
Remarque: Si vous avez créé un référentiel avec un README.md
, .gitignore
et LICENSE
, vous devrez d'abord tirer:
git pull origin master
git push origin master
Enfin, je veux supprimer le dossier du plus grand dépôt
git rm -rf btoa
...
annexe
Dernier Git sur macOS
Pour obtenir la dernière version de Git en utilisant Homebrew :
brew install git
Dernier Git sur Ubuntu
sudo apt-get update
sudo apt-get install git
git --version
Si cela ne fonctionne pas (vous avez une très ancienne version d'Ubuntu), essayez
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Si cela ne fonctionne toujours pas, essayez
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 des commentaires.
Effacer votre historique
Par défaut, la suppression de fichiers de Git ne les supprime pas réellement, il confirme simplement qu'ils ne sont plus là. Si vous souhaitez réellement supprimer les références historiques (c'est-à-dire que vous avez un mot de passe validé), vous devez le faire:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
Après cela, vous pouvez vérifier que votre fichier ou dossier n'apparaît plus du tout dans l'historique Git
git log -- <name-of-folder> # should show nothing
Cependant, vous ne pouvez pas "pousser" les suppressions vers GitHub et autres. Si vous essayez, vous obtiendrez une erreur et vous devrez le faire git pull
avant de pouvoir git push
- et vous reviendrez à tout avoir dans votre histoire.
Donc, si vous souhaitez supprimer l'historique de "l'origine" - c'est-à-dire le supprimer de GitHub, Bitbucket, etc. - vous devrez supprimer le dépôt et repousser une copie élaguée du dépôt. Mais attendez - il y a plus ! - Si vous voulez vraiment vous débarrasser d'un mot de passe ou de quelque chose comme ça, vous devrez tailler la sauvegarde (voir ci-dessous).
Rendre .git
plus petit
La commande de suppression de l'historique susmentionnée laisse toujours un tas de fichiers de sauvegarde - parce que Git est trop gentil pour vous aider à ne pas ruiner votre dépôt par accident. Il supprimera éventuellement les fichiers orphelins au fil des jours et des mois, mais il les laissera là pendant un certain temps au cas où vous réaliseriez que vous avez accidentellement supprimé quelque chose que vous ne vouliez pas.
Donc, si vous voulez vraiment vider la corbeille pour réduire la taille du clone d'un dépôt immédiatement, vous devez faire toutes ces choses vraiment étranges:
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 à moins que vous ne sachiez que vous devez - juste au cas où vous auriez élagué le mauvais sous-répertoire, vous savez? Les fichiers de sauvegarde ne doivent pas être clonés lorsque vous appuyez sur le dépôt, ils seront simplement dans votre copie locale.
Crédit
git filter-branch
voir ma réponse ci-dessous.