11 votes

Git - Pousser un sous-dossier vers un dépôt différent

J'ai un grand référentiel avec de nombreux fichiers et projets. L'un des sous-dossiers de ce référentiel doit être un nouveau référentiel séparé.

Je n'ai pas besoin de préserver l'historique dans le nouveau repo, mais je dois pouvoir, à tout moment, mettre à jour le nouveau repo avec les modifications du repo d'origine.

L'idée est que l'ancien repo est un gitlab interne privé et que le nouveau repo est un repo public pour le projet déployé.

Comment puis-je le faire ?

6voto

Marina Liu - MSFT Points 23516

Vous pouvez traiter le nouveau repo comme une sous-arborescence de l'ancien repo et mettez à jour le nouveau dépôt avec l'ancien dépôt de la manière suivante git subtree push . Les étapes détaillées sont les suivantes :

Supposons que l'ancien repo a des dossiers project1 , project2 , project3 etc. pour différents projets. Et le project1 a géré dans le nouveau repo.

Frist, remplacez le project1 dans l'ancien repo par le nouveau repo.

# Copy project1 folder out of old repo
# Delete the project1 folder in old repo, then use the commands in old repo
git add .
git commit -m 'delete project1 folder in old repo'
git subtree add --prefix=project1 <URL for new repo> master

Maintenant project1 Le dossier de l'ancien dépôt est le sous-arbre du nouveau dépôt. Vous pouvez faire des changements et commiter ( git commit) dans l'ancien repo.

Lorsque vous avez besoin de mettre à jour le nouveau repo par l'ancien repo, vous pouvez utiliser :

git subtree push --prefix=project1 <URL for new repo> master

Maintenant le nouveau repo sera mis à jour.

1voto

Mark Adelsberger Points 20504

La manière la plus "automatique" de mettre en place ce système est probablement d'utiliser des submodules. Vous pouvez lire sur les submodules ici : https://git-scm.com/book/en/v2/Git-Tools-Submodules

Je ne travaille pas beaucoup avec les submodules. Je peux vous dire que les gens critiquent souvent cette fonctionnalité, donc vous pouvez vous demander si cela en vaut la peine. Mais si vous voulez un support git direct pour l'idée que vous modifiez les fichiers dans le contexte du repo plus large, et que le repo public plus spécifique reçoive la mise à jour, alors c'est le seul moyen auquel je pense pour l'obtenir.

Donc si vous décidez d'utiliser cette approche, vous devrez :

  • vérifier la version appropriée du dépôt parent
  • initialiser un nouveau repo pour servir de repo enfant
  • déplacer tout ce qui se trouve dans le sous-répertoire de l'arbre de travail de la version parentale vers l'arbre de travail de la version enfant.
  • commettre le repo enfant
  • remplacer le sous-répertoire dans le repo parent par une référence au sous-module

Une petite configuration supplémentaire est nécessaire pour pouvoir pousser les changements vers le sous-module ; voir la page de documentation liée pour tous les détails.

Si une approche moins "git-centrique" est acceptable, alors vous pourriez simplement script le processus de prendre une mise à jour du repo "parent" et de l'appliquer au repo enfant. La difficulté de ce processus dépend de vos exigences spécifiques. (Est-ce qu'une "mise à jour" signifie simplement un nouvel instantané que vous avez choisi pour être ajouté au master du repo enfant ? Ou, au cours d'une mise à jour, devez-vous répliquer l'historique intermédiaire ?)

Si, à un moment donné, vous avez besoin de script un transfert d'historique, vous voudrez utiliser git filter-branch avec le subdirectory-filter pour créer de nouveaux commits, que vous récupérerez ensuite dans le repo enfant et que vous grefferez (probablement à l'aide de l'option filter-branch encore) sur l'arbre de l'histoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X