2012-07-02 1 views
1

J'ai un dépôt de 2 ans qui a commencé comme étant essentiellement un dépôt privé, de sorte qu'il trouve dans son histoire à différents points: fichiers clés, les clés de chiffrement , de grands ensembles d'images dans divers lieux, etc etc, dans l'histoire du référentiel, tous ne sont plus suivis, mais existent toujours dans l'histoire.En utilisant git, comment puis-je créer un clone la plupart du temps, moins l'histoire d'un dépôt

La source est en train de devenir partagé, puisque nous apportons de nouveaux développeurs, et je veux faire un démarrage propre avec un dépôt pour la plupart propre. Cependant, au cours de cette période de transition, je dois traiter avec l'ancien référentiel ainsi, le partage de patches/engage entre les deux référentiels. Quelle est la meilleure façon de rompre avec l'histoire précédente dans git tout en conservant rétrocompatibilité la possibilité de partager les commits entre l'ancien dépôt et le nouveau dépôt propre, aussi proprement que possible?

Objectifs:

  1. Faire commits sensibles dans le passé de façon de l'histoire non disponible dans le nouveau référentiel.
  2. Allow fonctionnalités dans le nouveau référentiel (clone, pousser, Fetch, tout ce qui est normal pour git)
  3. Maximisez la capacité de l'ancien repo à reconnaître les correctifs/engage qui viennent du nouveau repo
  4. [Moins important ] Rendre le nouveau repo plus rapide car il n'y a pas de binaires dans les anciens commits qui ne sont pas présents dans la copie de travail.

Répondre

2

Juste créer une nouvelle branche clair dans votre repo ne va pas aider existant: Si les utilisateurs pouvaient lire cette branche, ils auront également accès à vos vieilles branches qui contiennent vos informations sensibles. Pour surmonter cela, vous devrez créer un nouveau rapport sans connaissances (ou seulement limitées) sur le passé.

Pour ce faire, je fais ce qui suit:

  • Prenez relativement nouvel état de votre pension (par exemple la dernière version étiquetée ou quelque chose comme ça, dire V1.0) et l'utiliser comme un début pour créer un nouveau repo (newrepo) qui est utilisé par vos nouveaux développeurs.

  • Puis, sur votre machine, ajoutez un remote appelé oldrepo qui pointe vers l'ancien référentiel contenant les anciennes données sensibles.

  • Ensuite, prendre tous les commits de V1.0 jusqu'au dernier de oldrepo et cherry-pick dans votre nouveau dépôt. À ce stade, votre nouveau dépôt a le même état que oldrepo sans l'historique sale.

  • Maintenant, clone un repo nu de newrepo (newrepo.git). Tous vos développeurs clonez newrepo.git et travaillez dessus.

Si elle vient de prendre des correctifs, etc. de newrepo.git en oldrepo ou vice-versa, cette opération se fera par vous, à savoir vos collègues que vous envoyez besoin des correctifs générés par format-patch et vous am eux dans l'ancien repo. Si vous avez fait quelques corrections dans oldrepo, vous pouvez encore les cherry-pick en newrepo.git et les rendre disponibles à vos devs.

Ceci limite l'accès à oldrepo à vous et vos collègues ne verront jamais de données sensibles.

0

Cela dépend ce que vous entendez précisément par « compatibilité ascendante », mais vous devriez être en mesure de préciser un argument --depth 1 à git clone (tel que décrit dans le git-clone man page) et obtenir quelque chose où patches peuvent être partagés (bien que commits ne pourront pas être partagés via le mécanisme normal de push/pull auquel vous pourriez être habitué

+0

Clarification de la "rétrocompatibilité" à quelque chose de plus proche de la "compatibilité de partage de commit". En ce qui concerne l'utilisation de --depth 1, cela ne crée-t-il pas un dépôt invalidé, un peu? Cette page dit "Un dépôt peu profond a un certain nombre de limitations (vous ne pouvez pas le cloner ou le récupérer, ni le pousser depuis ou vers l'intérieur)". Ceux-ci semblent être des désavantages invalidants que je veux absolument éviter, puisque seulement à court terme des commits seront faits à l'ancien dépôt, et dans un mois ou deux tous les commits et branchements, etc etc seront faits au dépôt * new * . – Kzqai

1

Ce que vous pouvez essayer (je ne sais pas si cela fonctionne) est de créer une branche distincte qui suit le nouveau développement, qui commence le commit vide (c'est-à-dire n'a pas de parent) et vient de copier le contenu. Si vous fusionnez cette branche dans l'ancien maître (à la main). Après cela, vous devriez être en mesure de développer sur la nouvelle branche et tirer les changements de l'ancienne branche. Et vous n'avez pas à publier l'ancienne branche à d'autres.

Comme l'image et il comme ça, où O est la branche d'origine, C est exemplaire dans une nouvelle branche parentless, M étant la fusion manuelle et m étant des fusions suivantes.

# -- # -- # -- O --- M ------------ m -- m 
        /   //
       /   //
        C -- # -- # -- # -- # -- # 
+0

Hmmm, intéressant, donc (pour partager le développement) je devrais pousser à un référentiel frais, poussant seulement cette branche unique en quelque sorte? On dirait que je ne serais pas capable de faire ça parce que C est juste un patch comme n'importe quel autre commit, donc faire un nouveau dépôt ne ferait que ça ne marcherait pas? – Kzqai

+0

Oh, je vois, le contenu serait copié à la main, je suppose. Pouvez-vous suggérer comment je créerais un "engagement vide"? – Kzqai

+0

Pour créer un commit sans parent, réglez le HEAD manuellement et réinitialisez l'index: 'git symbolic-ref HEAD réfs/heads/newbranch' et' rm .git/index'. Ensuite, vous copiez sur le contenu ajoutez-le à l'index et validez ce qui aboutit à 'C'. Et oui, vous pouvez essentiellement séparer les dépôts; l'un est le "public" qui ne contient que les enfants commençant par "C" et l'autre les "autres", donc vous apportez de nouveaux changements du public à l'autre. – poke

0

Utilisez la branche git pour créer une nouvelle branche. Puis git rebasez votre premier à dernier commit pour avoir une version sans historique de votre ancienne branche.

Vous pouvez toujours revenir à l'ancienne branche pour obtenir des détails spécifiques engager.

Questions connexes