Git: copie tous les fichiers d'un répertoire à partir d'une autre branche

Comment copier tous les fichiers d'un répertoire à partir d'une autre branche? Je peux lister tous les fichiers dans ce répertoire en faisant

git ls-tree master:dirname

Je peux le copier tous les fichiers individuellement en faisant

git checkout master -- dirname/filename

Cependant, l'utilisation de caractères génériques a jusqu'à présent été un échec total. Cela ne fait rien:

git checkout master -- dirname/*.png

Bien que je suppose que je peux utiliser un script bash pour le faire, il doit y avoir un moyen plus facile, non?

145
demandé sur Xavi 2010-04-19 19:55:02

3 réponses

Comme vous n'essayez pas de déplacer les fichiers dans l'arborescence, vous devriez pouvoir simplement extraire le répertoire:

git checkout master -- dirname
210
répondu CB Bailey 2010-04-19 16:04:50

S'il n'y a pas d'Espaces Dans les chemins, et que vous êtes intéressé, comme je l'étais, dans les fichiers d'extension spécifique seulement, vous pouvez utiliser

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
14
répondu test30 2017-02-22 10:09:38

Si vous voulez préserver l'histoire, vous pouvez éventuellement essayer ceci... créez un Nouveau target-branch hors du master avant d'expérimenter.

Les étapes suivantes supposent que vous avez deux branches target-branch et source-branch, et le répertoire dir-to-merge que vous voulez de fusion est dans le source-branch. Supposons également que vous ayez d'autres répertoires comme dir-to-retain dans la cible que vous ne voulez pas modifier et conserver l'historique. En outre, suppose qu'il y a des conflits de fusion dans le dir-to-merge.

git checkout target-branch
git merge --no-ff --no-commit -X theirs source-branch
# the option "-X theirs", will pick theirs when there is a conflict. 
# the options "--no--ff --no-commit" prevent a commit after a merge, and give you an opportunity to fix other directories you want to retain, before you commit this merge.

# the above, would have messed up the other directories that you want to retain.
# so you need to reset them for every directory that you want to retain.
git reset HEAD dir-to-retain
# verify everything and commit.
0
répondu code4kix 2018-10-05 14:55:04