Предположим, два репозитория git с некоторыми файлами в них:

ProjectA
+ a
+ b

ProjectB
+ foo/x
+ foo/y
+ bar/z

Теперь я хочу включить каталог foo из ProjectB в ProjectA .

Насколько я понимаю, когда я делаю git subtree add, prefix - это путь, который он должен иметь в принимающем репозитории, поэтому, когда я делаю

git subtree add --prefix=project_b --squash URL_of_ProjectB

Я бы закончил с

ProjectA
+ a
+ b
+ project_b
  + foo/x
  + foo/y
  + bar/z

Могу ли я как-то указать, что я хочу получить только foo, чтобы получить этот макет?

ProjectA
+ a
+ b
+ project_b
  + x
  + y
6
AndreKR 17 Май 2013 в 10:52

1 ответ

Лучший ответ

Я думаю, что этого нельзя добиться с помощью git subtree. Может быть, git filter-branch - это то, что вам нужно:

git remote add b <URL_TO_B>
git fetch b
git checkout -b b_master b/master

Перепишите историю b, содержащую только foo:

git filter-branch --prune-empty --subdirectory-filter foo b_master

Или используйте git subtree split

git subtree split -P foo --branch foo

И добавьте его как поддерево

git subtree add --prefix=project_b --squash b_master or foo
5
gregor 17 Май 2013 в 12:09
Изменит ли это процесс слияния дальнейших изменений ProjectB с ProjectA? Я думал, что мой сценарий - это именно то, для чего предназначен git subtree, но если это не так, что можно с его помощью? Может быть, я смогу изменить макет файла, чтобы он подходил лучше.
 – 
AndreKR
17 Май 2013 в 11:45
Да, вам нужно повторять шаг ветвления фильтра каждый раз, когда вы хотите объединить изменения из ProjectB в ProjectA. На странице руководства git subtree объясняется команда git split, которая похожа на команду filter-branch, которую я дал. Но если вы можете изменить свой макет, возможно, лучше извлечь содержимое foo в отдельный репозиторий и добавить его как поддерево в оба проекта. Может, так лучше, раз уж b какая-то библиотека?
 – 
gregor
17 Май 2013 в 11:54
В том-то и проблема, на самом деле это не так. Если бы это было так, я бы сделал это подмодулем. Это скорее какой-то код, который используется в двух проектах ... список стран, несколько шаблонов и т. Д.
 – 
AndreKR
17 Май 2013 в 12:15
2
Я решил отделить поддерево с помощью git subtree split в исходном репозитории, нажать новую ветвь, а затем загрузить эту ветвь в принимающую, используя git subtree add. Спасибо.
 – 
AndreKR
19 Май 2013 в 14:20
Можно ли также объединить обратно изменения в извлеченном каталоге "foo" из ProjectA в ProjectB?
 – 
ceztko
25 Апр 2014 в 03:41