Как объединить подкаталог в git?

Можно ли объединить только изменения для подкаталога из локальной ветки git в удаленную ветвь git или это все или ничего?

Например, у меня есть:

branch-a
 - content-1
 - dir-1
   - content-2

и

branch-b
 - content-1
 - dir-1
   - `content-2

Я хочу только объединить содержимое ветки -dir-1 с содержимым ветки-b dir-1.

Ответ 1

Как альтернатива SO-запросу "Как слить выборочные файлы с помощью git -merge?, я просто нашел этот поток GitHub, который может быть более приспособлен для слияния целого подкаталога на основе git чтения дерева

  • Мой репозиторий = > cookbooks
    Мой целевой каталог репозитория = > cookbooks/cassandra

  • Удаленный репозиторий = > infochimps
    Удаленный источник репозитория, который я хочу объединить в cookbooks/cassandra = > infochimps/cookbooks/cassandra

Вот команды, которые я использовал для их объединения

  • Добавить репозиторий и получить его
git remote add -f infochimps git://github.com/infochimps/cluster_chef.git
  • Выполнить слияние
git merge -s ours --no-commit infochimps/master
  • Объединить только infochimps/cookbooks/cassandra в cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
  • Зафиксировать изменение
 git commit -m 'merging in infochimps cassandra'

Добавление

Это странно, [edit me] но шаг read-tree может завершиться следующим образом:

error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.

... даже если оба файла идентичны. Это может помочь:

git rm -r cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra

Но не забудьте проверить вручную, что это делает то, что вы хотите.

Ответ 2

В моем примере предположим, что у вас есть ветвь "источник" и "конечный пункт" ветки, которые оба отражают собственные версии восходящего потока (или нет, если только локальные) и тянутся к последнему коду. Пусть говорят, что я хочу, чтобы подкаталог в репо назывался newFeature, который существует только в ветки "source".

git checkout destination
git checkout source newFeature/
git commit -am "Merged the new feature from source to destination branch."
git pull --rebase
git push

Значительно менее запутанный, чем все остальное, что я видел, и это отлично сработало для меня, найденный здесь.

Обратите внимание, что это не "реальное объединение", поэтому у вас не будет информации о фиксации newFeature в ветке назначения, а только изменения файлов в этом подкаталоге. Но так как вы, вероятно, собираетесь объединить всю ветку назад позже или отбросить ее, это может не быть проблемой.

Ответ 3

Я получил это из темы форума в Eclipse и работал как шарм:

git checkout source-branch
git checkout target-branch <directories-or-files-you-do-**NOT**-want> 
git commit
git checkout target-branch
git merge source-branch

Ответ 4

create git repo содержит как ветку-a, так и ветку-b

git checkout branch-a
git diff branch-b dir-1 > a.diff
patch -R -p1 < a.diff