2010-11-24 51 views
1

Je veux git-pousser un répertoire plein de données binaires vers un serveur distant.git squash suivi de push retransmet les données

Comme cela peut prendre des jours, je commets localement et je pousse un fichier à la fois (si je commets tout en même temps et que j'appuie, si le transfert est interrompu, il faut recommencer depuis le début, non?).

Lorsque tout est transféré, je veux écraser tous ces commits en un seul. Si je squash local et ensuite pousser, toutes les données sont transmises à nouveau! ce qui défait le but de ma stratégie. Peut-être que je pourrais me connecter à la télécommande, et répéter l'opération de squash à distance, mais est-il une meilleure façon de faire ce que je veux faire. Comment informer git que toutes les données sensibles sont déjà sur le serveur?

Répondre

1

D'abord, les binaires ne sont pas mieux réussi dans un VCS)

En second lieu, si vous devez, vous pouvez installer un crochet sur la prise en pension à distance pour effectuer la courge lors de la réception d'un certain commettras (comme un rien contenant push mais un fichier spécial, validant que tous les commits précédents peuvent être écrasés).
Je ne suis pas sûr de la mise en œuvre exacte, mais il semble que toute solution impliquant un squash git devrait avoir lieu à la fois localement et sur le côté distant, pour assurer un historique similaire.

Et ce serait très sûr s'il y a d'autres validations provenant d'autres contributeurs au référentiel distant. Alors l'histoire serait impossible à synchroniser correctement entre votre repo local et ce qui aurait été fait sur le côté à distance ...
Le seul autre plan d'action après une telle poussée spéciale suivie d'une courge sur le côté à distance serait de renommez votre branche actuelle et tirez la branche distante afin de réinitialiser la version locale de cette branche à ce qui est du côté distant.

+0

Merci pour la réponse! Pour dire la vérité, pour ma tâche, j'utilise git parce que c'est le seul que je connaisse qui peut suivre les renames: quand je décide d'organiser/nettoyer ma collection de photos, git ne va pas tout télécharger sur le serveur (rsync). Ensuite, je pense que ça ne vaut pas la peine de mettre un crochet sur la télécommande, je vais vivre avec l'histoire encombrée. – rafak

0

Je ne suis pas sûr mais je pense que git ne transmettra pas les objets s'ils l'ont déjà. Techniquement, le commit ne contient pas vos objets binaires mais seulement une référence à un arbre qui contient des références à des objets. Chaque objet est un identifiant unique (le SHA) donc il doit savoir qu'il les a déjà ou non. Donc, normalement, il n'est pas nécessaire d'envoyer une seconde fois les objets binaires. Essayez-le, et cela devrait fonctionner comme vous voulez sans rien faire.

+0

C'est ce que je pensais, mais en poussant, git dit qu'il est en train de transmettre (autant de Mo qu'il y a de parent du nouveau commit écrasé, et cela prend le temps correspondant). Cependant, lorsque je vérifie l'utilisation du disque sur la télécommande, il reste (presque) le même, comme si les données nouvellement transmises étaient immédiatement ignorées du côté serveur. – rafak

+0

avez-vous essayé git push --thin? – mb14

+0

Oui, cela ne change rien (et le doc dit --thin est la valeur par défaut). – rafak