Извлечение git-истории для части git-репо для создания подмодуля git - cherry-pick - PullRequest
2 голосов
/ 13 июня 2011

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

У меня есть модуль, который я скачал как тарбол. Я включил его в репозиторий моего основного проекта и внес в него изменения. Эти изменения чередуются с другими коммитами для основного проекта.

Я осознал ошибку своих способов и хочу заменить модуль на подмодуль git. Я мог бы просто добавить текущее состояние, но я хочу сохранить свою историю с git.

Как я могу переместить каждый отдельный коммит в мой новый репо?


Я думаю, что могу сделать это с вишневым киркой, но это отнимает много времени. Вот что у меня есть:

Настройка моего нового репо с основным проектом в качестве удаленного (чтобы я мог выбрать вишню):

cd ~/snippets
git remote add main ~/.vim/
git fetch main

Я вижу соответствующие коммиты в основном проекте с git log ~/.vim/snippets

Я могу сделать скрипт для вишни с

cd ~/.vim/snippets
git log --oneline --reverse --format="format:git cherry-pick %h #%s" .

Но если я запускаю сценарий, возникают конфликты слияния. После того, как я разрешу слияние и фиксацию, мне нужно удалить удачные биты из моего сценария выбора вишни и запустить его снова. Я хотел бы сделать это автоматически, например, git rebase.

Ответы [ 4 ]

1 голос
/ 13 июня 2011

Вам может пригодиться git filter-branch - если вы используете --tree-filter для перемещения файлов и --commit-filter для удаления коммитов, которые не влияют на вашу ветку, то вы сможете получить ветка, содержащая только изменения из вашего подпроекта.

Если у вас нет времени на это сейчас, вы можете использовать мой другой ответ в качестве временной меры:).

0 голосов
/ 24 июня 2011

Этот вопрос показывает гораздо более простой способ:

git filter-branch --subdirectory-filter repo/subdirectory -- --all

С git help filter-branch:

--subdirectory-filter <directory>

Только посмотрите на историю, которая касается данного подкаталога. Результат будет содержать этот каталог (и только это) в качестве его корень проекта. Подразумевает раздел под названием «Преобразовать в предка».

0 голосов
/ 14 июня 2011

Похоже, что git-subtree может сделать это.Вот соответствующее сообщение в блоге от разработчика.

0 голосов
/ 13 июня 2011

Если вам просто нужна история, но вам не важно, есть ли там дополнительные данные, вы можете просто создать пару веток, одну для основного кода и одну для фрагментов. Переместите фрагменты на верхний уровень в их ветке, удалив остальные файлы. Вы должны обнаружить, что отслеживание переименования позволяет вам просматривать историю файлов, хотя у вас, очевидно, будут дополнительные файлы и коммиты в вашей истории. Затем вы можете использовать эту ветку (возможно, клонированную в отдельный репозиторий) в качестве вашего подмодуля.

Тогда, в будущем, когда у вас будет больше времени, вы можете использовать мой другой ответ, чтобы очистить свою историю:).

...