2012-05-09 1 views
36

J'essaie de déplacer un fichier unique (appelez-le foo.txt) d'un dépôt vers un autre (non apparenté), en préservant son historique. ebneter's question montre comment faire cela pour un sous-répertoire. taw's question a quelques conseils et suggestions, mais pas une procédure étape par étape à suivre. jkeating's question semblait prometteur, mais n'a pas fonctionné pour moi. Les recherches Google sont apparues vides pour ce cas d'utilisation particulier. Ce que je cherche est une séquence claire de commandes pour accomplir ceci.Comment déplacer un fichier d'un dépôt git à un autre tout en préservant l'historique

La séquence de commandes que j'ai commencé à suivre était la suivante:

$ git clone source-repo/ source-repo-copy 
$ cd source-repo-copy 
$ git filter-branch --tree-filter 'test ! "[email protected]" = "foo.txt" && \ 
    git rm --cached --ignore-unmatch [email protected] || true' --prune-empty 

La logique de ma commande de filtre est de git rm tous les fichiers qui ne sont pas toto.txt. J'ai ajouté le || true à la commande pour le forcer à avoir une valeur de retour nulle pour satisfaire la branche de filtre. Mon intention était de placer source-repo-copie comme une télécommande pour mon référentiel cible (repo cible), et en supposant git filter-branch filtré tout sauf foo.txt, chercher et fusionner source-repo-copie dans la cible-repo . Malheureusement, la commande git filter-branch semblait n'avoir aucun effet. Il a fonctionné sans erreurs et a semblé broyer à travers les 600 + commits dans le repo source, mais quand il a fini, le git log et les fichiers dans la copie de source-repo ont semblé identiques. Est-ce que tous les fichiers, sauf foo.txt, ne doivent pas tous être manquants et tous les validations qui n'ont pas été touchées doivent être retirés du journal?

À ce stade, je ne sais pas comment procéder. Aucune suggestion?

+2

Copie possible de [Comment déplacer des fichiers d'un dépôt git à un autre (pas un clone), en préservant l'historique] (http://stackoverflow.com/questions/1365541/how-to-move-files-from-one -git-repo-to-another-not-a-clone-preserving-history) – tripleee

Répondre

31

Cela a fonctionné pour moi, mais avec un répertoire entier.

Comme le montre here

~$ cd neu 
~/neu$ git filter-branch --subdirectory-filter FooBar HEAD 
~/neu$ git reset --hard 
~/neu$ git remote rm origin 
~/neu$ rm -r .git/refs/original/ 
~/neu$ git reflog expire --expire=now --all 
~/neu$ git gc --aggressive 
~/neu$ git prune 
~/neu$ git remote add origin git://github.com/FooBar/neu.git 

EDIT: Pour un seul fichier:

Filtrer le répertoire premier:

git filter-branch --prune-empty --subdirectory-filter myDirectory -- --all 

Filtrer le seul fichier:

git filter-branch -f --prune-empty --index-filter "git rm --cached --ignore-unmatch $(git ls-files | grep -v 'keepthisfile.txt')" 

procéder à un nettoyage:

git reset --hard 
git gc --aggressive 
git prune 

Cela devrait le faire.

+1

Oui, les exemples '--subdirectory-filter' semblent tous simples, mais je cherche à déplacer un seul fichier, pas un sous-répertoire. Des idées avec ça? –

+0

s'il vous plaît essayez-le sur un testrepo d'abord, la nouvelle solution fonctionne pour moi – blang

+1

J'ai filtré le répertoire que vous avez suggéré, en utilisant '.' au lieu de 'myDirectory'. Il me restait zéro fichier dans le répertoire (juste .git). 'git log' n'a montré que des commits de fusion (12 d'entre eux). J'ai ensuite filtré le fichier unique.J'ai eu des erreurs parce que 'git rm' était appelé avec une liste de paramètres vide. J'ai ajouté '|| true' à la fin de la commande pour éviter que les plaintes de git rm n'abandonnent le filtre. Après cela, toujours zéro fichiers, et seulement 4 commits de fusion dans 'git log'. J'ai fini avec 'git reset/gc/prune' mais je n'ai vu aucun changement. Je suppose que ça n'a pas marché. :(Je suis content d'avoir essayé ceci sur un rapport de test. :) –

0

S'il vous plaît voir ma réponse à une question similaire sur les dossiers de déménagement où je réponds également comment déplacer un fichier. https://stackoverflow.com/a/24693985/464618

J'ai essayé de le copier ici, mais il semble que ce n'est pas autorisé car il a été supprimé.

+3

Le système ne vous permet pas de publier deux fois la même réponse littérale. Vous devrez peut-être reformuler votre réponse ici pour l'afficher ici. Mais peut-être, il est préférable de simplement marquer la question comme un doublon. –

Questions connexes