Каков наилучший способ извлечения файлов и каталогов из репозитория git, переместить их в новое репо и использовать это новое репо в качестве подмодуля git? [Дубликат]

Я использовал для получения «следующей партии» для вещей. В этом случае не имеет значения точный элемент, и у меня есть много пользователей, которые запускают этот же запрос.

3
задан ChaseMedallion 12 August 2014 в 22:49
поделиться

2 ответа

git clone initial final
cd final
git filter-branch --tree-filter 'rm -rf <list of folders separated by space>' HEAD

Выше команды удалят любые папки, упомянутые в списке, но ваша исходная история фиксации будет сохранена.

git filter-branch -f --prune-empty 

Затем можно использовать для удаления любых пустых коммитов, которые могут отображаться на вашем Список удаленных папок.

Альтернативно, если у вас есть большой репозиторий, который имеет значительно долгую историю, это может занять некоторое время. В этом случае вы можете использовать несколько иной подход -

Начните с создания отдельных репозиториев для каждой папки, которую вы хотите перенести. Это можно сделать с помощью команды filter-branch следующим образом

 git filter-branch –prune-empty –subdirectory-filter A/ master
 git filter-branch –prune-empty –subdirectory-filter B/ master

Каждый из них будет иметь содержимое соответствующих папок вместе со всей их историей. Затем вы можете использовать их как временные репозитории на удаленном компьютере. (они также будут действовать как контрольные точки в случае необходимости повторного выполнения процесса)

Затем создайте новый репозиторий

git clone <remote path> NewRepo
cd NewRepo

# add a readme file
touch Readme.md
git add .
git commit -am "Adding ReadMe file"

Затем вы можете объединить отдельные папки (A и B repos) в NewRepo

# Merge Repo A
git remote add -f A <remote path for A>
git merge -s ours --no-commit A/master
git read-tree --prefix=A/ -u A/master
git commit -m "Merge A into NewRepo"
git remote remove A

# Merge Repo B
git remote add -f B <remote path for B>
git merge -s ours --no-commit B/master
git read-tree --prefix=B/ -u B/master
git commit -m "Merge B into NewRepo"
git remote remove B

Затем вы можете подтвердить, что ваш источник настроен на то, чтобы указать на NewRepo и нажать код

git remote add origin <remote path for NewRepo>
git push origin master

NewRepo теперь должен содержать обе папки и вся их история.

4
ответ дан KnightFox 28 August 2018 в 02:34
поделиться

В ветке фильтра может потребоваться некоторое время для запуска, но я бы попытался дублировать репозиторий локально и использовать его для тестов.

git clone repoA repoB
cd repoB
git filter-branch --tree-filter 'rm -rf C D <other files you DON'T want>' HEAD

Опять же, это может занять много времени, но Я думаю, что он будет делать то, что вы ищете.

0
ответ дан Christopher 28 August 2018 в 02:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: