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?
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
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')
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.