2014-06-12 3 views
0

Est-il possible de cloner un dépôt dans git et de ne pas conserver toutes les révisions?Réorganiser le référentiel git sans conserver les révisions localement

Mon référentiel est volumineux (dizaines de Go). Je ne veux pas doubler l'espace de stockage dans une copie de travail. Je veux juste les fichiers et savoir où aller pour pousser/tirer les mises à jour. Est-ce encore possible avec git ou dois-je retourner à subversion?

+1

"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! –

+0

@OliCharlesworth Il est vrai que ce n'est pas strictement du code, mais nous en avons besoin sous contrôle de version. – jlconlin

+0

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

Répondre

1

Vous pouvez créer un clone "peu profond", mais il crée un référentiel en lecture seule dans lequel vous ne pouvez ni aller chercher ni pousser dedans. Voici la commande:. git clone repoUrl.git --depth 1 --branch branch_name

1

Je pense que le plus proche vous allez arriver est d'utiliser l'option --depth à git clone pour limiter la quantité de l'histoire qui obtient tiré dans Cela signifie également que vous avez l'habitude de tous les l'historique disponible pour git log et vos amis - et vous ne pouvez pas exécuter git log sur un référentiel distant.

Cela dit, il y a d'autres bits à considérer. Git essaie de regrouper des objets similaires, ce qui lui donne une bonne compression lors de la création de packs. Cela signifie que les fichiers eux-mêmes doivent être similaires d'une manière ou d'une autre. Cela fonctionne très bien pour le code source, mais il peut être moins bon avec certains de vos formats binaires.

Git n'est pas génial avec des fichiers volumineux. Git a tendance à charger des fichiers entiers dans la mémoire, bien qu'il y ait eu quelques efforts pour réduire cela. Donc, vous voudrez peut-être faire quelques tests pour vous assurer que vous n'allez pas vous heurter à des bordures.

+0

Nous avons déjà nos données (pas binaires) sous contrôle de version. Git fonctionne, mais ce n'est pas vraiment rapide parfois. – jlconlin

+0

Je pensais que l'utilisation de '--dept 1 'fonctionnerait bien, mais cela n'a pas beaucoup changé la taille de mon dépôt. Mon répertoire d'origine '.git' était de 7,7 Go, le répertoire' --depth 1' '.git' était de 7,2 Go. La commande que j'ai utilisée était '$ git clone --depuis le fichier 1: /// chemin/vers/repo nouveau_repo' – jlconlin

+0

Vous pouvez ne considérer que suivre' master' en utilisant l'option '--single-branch' - vous pouvez besoin d'une nouvelle version de Git pour cela. Sinon, toutes les références auront une profondeur de 1, ce qui peut être un peu plus que ce que vous avez négocié (si vous aviez 10 autres branches, git s'assurerait que les objets nécessaires sont là pour ceux-là aussi). Alternativement, vous pouvez éditer votre '.git/config' et changer la ligne refspec pour refléter seulement les refs dont vous avez besoin (peut-être juste' master'). Vous devrez probablement exécuter 'git gc' pour laisser git supprimer les objets inutiles de votre clone local. – jszakmeister

1

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é:

  1. 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--bareu://r/l/to/real/upstream/path/to/reference/repo
    cd !$
    git tag -dall the tags that have even a whiff of instability about them
    git branch -Devery branch
    git rev-parseany-tag> HEAD

  2. 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.

1

Si le clone doit se trouver sur le même volume de système de fichiers, utilisez git clone --local.

Il utilise des liens physiques pour économiser de l'espace.

Regardez-le dans la page de manuel git-clone. Cela signifie que vous pouvez avoir l'historique complet sans doubler l'espace requis.

Questions connexes