Est-il possible de cloner un dépôt dans git et de ne pas conserver toutes les révisions?
Avec pas si beaucoup de discipline, vous pouvez utiliser --reference
dépôts pour garder juste un dépôt au niveau du site pour les grands, les parties stables d'une prise en pension, où « site » est défini comme « machines ayant accès à un système de fichiers partagé commun » .
Pour le rendre aussi sûr que votre système de fichiers partagé:
Faire un repo nu qui ne publie que des références stables. Le plus facile peut être de faire un clone complet, puis supprimer tous les instables.
git clone
--bare
u://r/l/to/real/upstream
/path/to/reference/repo
cd !$
git tag -d
all the tags that have even a whiff of instability about them
git branch -D
every branch
git rev-parse
any-tag
> HEAD
Utilisez cette prise en pension comme référence.Lors du clonage du réel amont,
git clone --reference /path/to/reference/repo u://r/l/to/real/upstream
Et ce qui est vraiment tout ce qu'il ya à l'utiliser en interne. La partie de la discipline est, vous devez être sûr que le système de fichiers avec votre dépôt sur elle est toujours disponible pour tout ce qui le référencie, et qu'aucun changement à votre dépôt ne laisse jamais un commit non référencé. chmod -R a-w
le fera bien.
Si les gens clone ainsi à leurs ordinateurs portables et les prendre quelque part sans accès au dépôt, ils ont besoin de déconnecter leurs clones à partir du dépôt d'abord:
# disconnect from depot:
git repack -Ad \
&& rm .git/objects/info/alternates
Notes:
Pour Ordinateurs portables vraiment sous-alimentés et vraiment gros repos, le remballage pourrait être gênant. Une autre façon est:
# disconnect from depots, minimal cpu load for underpowered localhost:
cp -r $(cat .git/objects/info/alternates) .git \
&& rm .git/objects/info/alternates
Il est également possible d'emballer « tout ce dont vous avez besoin » pour un voyage sur la route avec git pack-objects
et git rev-list
. Voici une façon de le faire:
# pack up what I have locally, mark it as reliably-present:
git repack -l
for pack in .git/objects/pack/*.pack; do
touch $pack.keep
done
# pack up everything I still don't have that might actually be useful
# no need to list tags that are ancestors of other tags here:
git rev-list --objects --all ^tag-I-dont-need ^another ^etc \
| git pack-objects --honor-pack-keep .git/objects/pack/pack
mv .git/objects/info/alternates{,.inaccessible}
# let git gc at what's here when needed
rm .git/objects/pack/pack-*.keep
et au retour au pli, remettez le fichier de remplacement.
"Mon dépôt est des dizaines de Go" - Je pense que c'est le problème. Git est conçu pour stocker * code * (ou similaire), probablement tout ce que vous stockez est loin d'être un code! –
@OliCharlesworth Il est vrai que ce n'est pas strictement du code, mais nous en avons besoin sous contrôle de version. – jlconlin
Vous pouvez utiliser des référentiels de référence ou une version de bas niveau 'objects/info/alternates' pour conserver une copie de l'ancien historique par site (un site étant des machines partageant au moins un système de fichiers commun fiable). Faites un dépôt vide pour récupérer les anciennes balises qui ne changeront pas, ajoutez '--reference path/to/that/repo' aux futurs clones qui n'ont pas besoin d'un accès rapide. Les clones, même de ces clones, qui ne spécifient pas la référence, obtiennent des copies complètes comme d'habitude. – jthill