2017-08-11 4 views
0

J'essaie de déplacer des fichiers entre deux dépôts git repo1 et repo2. J'ai une courte liste de fichiers que j'aimerais déplacer (en conservant l'historique).Supprimer l'historique pour tout sauf une liste de fichiers utilisant git filter-branch

Trois fichiers pour passer de repo1:

libraryname/file1 
libraryname/file2 
tests/libraryname/file3 

Il y a d'autres fichiers dans libraryname/ et tests/libraryname/. Il y a d'autres dossiers dans / et tests/

Mon plan est à la caisse repo1, puis modifier l'arbre de l'histoire jusqu'à ce qu'il ne contient que l'histoire pour les fichiers que je suis intéressé. Ensuite, la caisse repo2 et fusionner dans la sortie de la précédente opération. Il semble que git filter-branch est le bon outil pour la première étape.

Jusqu'ici, j'ai essayé git filter-branch --index-filter 'git rm -r --cached <FILES>'<FILES> liste tous les dossiers ou fichiers entiers indésirables.

Mais cela laisse beaucoup de dossiers qui n'existent plus à HEAD, mais qui ont existé à un certain moment dans la vie de ce dépôt. Il semble assez fastidieux de comprendre tout ce qui a existé dans l'histoire de ce repo - il doit y avoir un meilleur moyen

Comment finir avec un arbre de commit git qui n'inclut que ces trois fichiers? Y a-t-il un meilleur moyen que je suggère? Ou, est-il un moyen de supprimer les traces de tous les fichiers qui n'existent pas actuellement à HEAD?

Répondre

2

Vous avez dit qu'il laisse derrière les dossiers; Je suppose que vous voulez dire qu'il laisse derrière les fichiers dans ces dossiers (parce que git ne conserve pas les dossiers vides) ...

Il semble que vous souhaitiez prendre l'approche de l'effacement de l'index, puis rajouter le entrées que vous voulez.

git filter-branch ... 
    --index-filter 'git rm -r --cached * && git reset $GIT_COMMIT -- libraryname/file1 libraryname/file2 tests/libraryname/file3 
    ... 

Puisque vous amincir le contenu tant, ne pas oublier que vous voulez dire à inclure une option --prune-empty