Оформление определенной папки в репозитории Git

У меня есть несколько проектов в разных хранилищах:

tools

thirdparty

shared
├──Common
├──Exceptions

multimedia
├──VolumeControl
├──VideoRenderer

android
├──Audio

Например, android зависит от shared/Common, shared/Exceptions, инструментов третьих лиц и multimedia/VolumeControl.

Я старался:

  1. Подмодули: https://git-scm.com/book/en/v2/Git-Tools-Submodules
  2. sparse-checkout: http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/

Тем не менее, они оба извлекают или приносят мультимедийную папку в папке Android. Вместо этого я хочу это как:

android
├──Audio
├──VolumeControl (brought in from multimedia)

Как мне это сделать?

Примечание: я использовал для этого, используя lockexterns в SVN.

2 ответа

Решение

Как мне это сделать?

Ты можешь использовать git filter-branch и или git subtree split

filter-branch будет зацикливаться на каждом коммите, а затем вы можете извлекать только указанные файлы, пока git subteree split будет лучшим вариантом в вашем случае.

Объясняя оба варианта, чтобы вы могли выбрать тот, который вы предпочитаете.


Образец кода:

filter-branch

# Filter the master branch to your directory and remove empty commits
git filter-branch --prune-empty --subdirectory-filter YOUR_FOLDER_NAME filter_from_branch

Это извлечет все ваши нужные файлы из данной папки в текущий каталог


subtree split

git subtreegit-subtree - Merge поддеревья вместе или split хранилище в поддеревья

git subtree split -P <name-of-folder> -b <name-of-new-branch>

Интересно, почему с git-submodule это не могло быть достигнуто. Как я помню, с помощью подмодулей можно указать каталог назначения, и, следовательно, возможно, вы можете сделать что-то вроде этого:

$ cd Android
$ git submodule add url/path-to-your-submodule-repo VolumeControl
$ git diff --cached --submodule # OPTIONAL - To verify before commit
$ git commit -m 'added multimedia/VolumeControl as sub-module'
Другие вопросы по тегам