переместить некоторые файлы из репозитория git в новый - PullRequest
0 голосов
/ 11 января 2019

У меня есть git репозиторий, который, по сути, содержит два связанных проекта, которые я хотел бы сейчас разделить. Я хотел бы переместить файлы, связанные с одним проектом, в новый репозиторий, сохранив историю изменений. Чтобы быть конкретным, предположим, что исходный репозиторий git содержит:

file1.c
file2.c
subdir/file2_extra.c

Кроме того, оригинальный git репозиторий содержит несколько веток. Я хочу оставить только некоторые из них, связанные с файлами, которые я хочу разделить.

Как мне создать новый git репозиторий, содержащий, скажем, только file2.c и subdir/file2_extra.c вместе с историей коммитов к ним?

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

Я пытался использовать git filter-branch, но безуспешно. Давайте предположим, что исходный репозиторий git_original, то, что я пробовал -

$ git clone git_original/ git_new
Cloning into 'git_new'...
done.
$ cd git_new
$ git rm file1.c
rm 'file1.c'
$ git filter-branch --prune-empty -- --all
Cannot rewrite branches: Your index contains uncommitted changes.

Но если я фиксирую удаление file1.c, то git filter-branch ничего не делает.

1 Ответ

0 голосов
/ 14 января 2019

Исходя из этой ссылки (спасибо @marekful за предоставление) я разработал это решение. Основная идея состоит в том, чтобы клонировать репозиторий в новый и исключить ненужные файлы в каждом коммите. Я предполагаю, что у одного есть удаленное хранилище, и каждая локальная ветвь отслеживает соответствующую удаленную ветвь.

Клонируйте старый репозиторий в новый.

$ git clone git_original/ git_new

Перейдите в новый репозиторий.

$ cd git_new

Для каждой требуемой ветви в новом хранилище настроить ветку.

$ git branch -t branch_name origin/branch_name

Удалить все ненужные файлы в новом хранилище. Например, в примере с вопросом я хотел удалить файл file1.c.

$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file1.c' \
      --prune-empty -- --all

Опция -f должна быть необходима, если вы удаляете более одного файла, так как она заставляет перезаписывать «старые» ссылки.

С помощью git checkout для всех ветвей нового хранилища вы можете проверить, что действительно ненужные файлы были удалены.

Некоторая очистка.

$ git reflog expire --expire=now --all
$ git gc --prune=now --aggressive

Теперь удалите старый источник и свяжитесь с новым удаленным репозиторием.

$ git remote rm origin
$ git remote add origin remote_origin_address

Наконец-то перенесите все на новый пульт.

$ git push -u origin --all
$ git push -u origin --tags
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...