Je voudrais fusionner un dépôt git distant dans mon dépôt git de travail comme un sous-répertoire de celui-ci. J'aimerais que le dépôt résultant contienne l'historique fusionné des deux dépôts et aussi que chaque fichier du dépôt fusionné conserve son historique tel qu'il était dans le dépôt distant. J'ai essayé d'utiliser la stratégie de sous-arborescence telle que mentionnée dans le document Comment utiliser la stratégie de fusion de sous-arbres ? Mais après avoir suivi cette procédure, bien que le dépôt résultant contienne effectivement l'historique fusionné des deux dépôts, les fichiers individuels provenant du dépôt distant n'ont pas conservé leur historique (`git log' sur l'un d'entre eux montre juste un message "Merged branch...").
Je ne veux pas non plus utiliser de submodules car je ne veux plus que les deux dépôts git combinés soient séparés.
Est-il possible de fusionner un dépôt git distant dans un autre en tant que sous-répertoire, les fichiers individuels provenant du dépôt distant conservant leur historique ?
Merci beaucoup pour toute aide.
EDIT : J'essaie actuellement une solution qui utilise git filter-branch pour réécrire l'historique du dépôt fusionné. Cela semble fonctionner, mais je dois la tester un peu plus. Je reviendrai pour faire un rapport sur mes découvertes.
EDIT 2 : Dans l'espoir d'être plus clair, je donne les commandes exactes que j'ai utilisées avec la stratégie de sous-arbres de git, qui ont pour résultat une perte apparente de l'historique des fichiers du dépôt distant. Soit A le dépôt git dans lequel je travaille actuellement et B le dépôt git que je voudrais incorporer dans A en tant que sous-répertoire de celui-ci. Il a fait ce qui suit :
git remote add -f B <url-of-B>
git merge -s ours --no-commit B/master
git read-tree --prefix=subdir/Iwant/to/put/B/in/ -u B/master
git commit -m "Merge B as subdirectory in subdir/Iwant/to/put/B/in."
Après ces commandes et en allant dans le répertoire subdir/Iwant/to/put/B/in, je vois tous les fichiers de B, mais git log
sur l'un d'entre eux ne montre que le message de livraison "Merge B as subdirectory in subdir/Iwant/to/put/B/in". L'historique de leurs fichiers tel qu'il est dans B est perdu.
Quoi semble pour fonctionner (comme je suis un débutant sur git, je peux me tromper) est la suivante :
git remote add -f B <url-of-B>
git checkout -b B_branch B/master # make a local branch following B's master
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&subdir/Iwant/to/put/B/in/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
git checkout master
git merge B_branch
La commande ci-dessus pour filter-branch est tirée de git help filter-branch
dans lequel je n'ai changé que le chemin du sous-répertoire.
0 votes
Qu'est-ce que
gitk
dire sur l'histoire ? J'ai utilisé git subtree merge avec succès dans le passé. Peut-être pouvez-vous révéler vos commandes exactes ? Je ne suis pas sûr que git-filter-branch soit la bonne approche. Je pourrais recommander d'essayer git-fast-export et git-fast-import pour synthétiser un nouvel historique.0 votes
Après avoir effectué la procédure de sous-arbre
gitk
montre les deux dépôts fusionnés sur leurs pointes et non liés dans leurs commits initiaux. (Cela aiderait-il si je postais des captures d'écran de la vue historique de gitk ? Puis-je ?) Malheureusement, les fichiers individuels du dépôt distant n'ont pas conservé leur historique si je fais dans le terminalgit log <file-from-remote-repo>
. Je regarde dansgit-fast-export
ygit-fast-import
Je suis très novice en matière de git. Je vais modifier ma question pour montrer exactement les commandes que j'ai utilisées avec git subtree. Merci beaucoup pour votre réponse.0 votes
@christosc : votre deuxième méthode a fonctionné à merveille et très simplement, merci beaucoup ! J'ai juste dû changer subdirir/Iwant/en/put/B/in/ et en faire un oneliner (parce que msysgit sous Windows ne semble pas supporter les retours à la ligne dans les commandes avec ) : git filter-branch --index-filter 'git ls-files -s | sed "s- \t\ "*-&subdir/Iwant/to/put/B/in/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
0 votes
@user1121352 Heureux d'avoir pu vous aider.
0 votes
Je suis normalement cette réponse : stackoverflow.com/a/1684694/207791