2013-05-13 3 views
0

Некоторое время назад я переместил репозиторий Subversion в Git и github, когда решил использовать Open Source какое-то программное обеспечение, и я не уверен, что я сделал, но история фиксации не была перенесена. В то время я думал, что мне все равно, но теперь я думаю, что мне действительно понравятся 2+ года совершения в Гитубе, если не по какой-либо другой причине, кроме записи о работе. Проблема в том, что мой проект был на Github на некоторое время и был раздвоен и получил фиксации с момента его создания.Перемещение исторического SVN происходит в существующем репозитории Github?

Есть ли способ «назад порт», исторический коммит из моего старого репо, и положить их в живое, дышая реку Github?

Примечание: Я без преувеличения попробовал svn2git --rebase, но я не уверен, что это сработает, учитывая, что произошли коммиты с момента останова svn repo. Я получил эту ошибку, и я не уверен, что это значит:

command failed: 
2>&1 git svn fetch 

ответ

2

Восходящее в мерзавца не более, чем совершить (который представляет собой текстовый файл), содержащий одну или несколько строк, которые считывают parent <hash of parent commit>. Если вы хотите вставить историю до первого фиксации, ей понадобится родительская строка, подобная этой (первая фиксация не имеет ее), и это изменило бы хэш первого коммита, что означало бы, что его потоку (потомкам) потребуется изменить родительский указатели, и это происходит рекурсивно через все коммиты, так как все они происходят от первого фиксации репо.

Если вы не беспокоитесь о том, чтобы испортить людей, работающих над вилками (потому что вы измените историю в своем проекте), вы можете просто повторить операцию, чтобы создать второе git-репо из старой истории, добавить, что repo как удаленный от вашего нового репо, и извлеките изменения, Теперь у вас будет два корня в вашем новом репо. Вы можете получить предупреждение об отсутствии коммитов; это отлично. Теперь вы можете просмотреть историю, чтобы получить свои ориентиры: git log --all --graph --oneline --decorate, а затем, возможно, сделайте rebase --onto, чтобы переместить новую работу нового репо поверх истории старого репо, которую вы только что принесли. Предположительно, дерево в вашей первой фиксации репо будет идентично дерево в вашем последнем прошлом репо, так что это может быть так же просто, как: git rebase --onto A B C, где A - последняя фиксация в истории старого репо, которую вы только что внесли, B - это первая фиксация в новом репо (которая здесь рассматривается «старая база» нового репо, которую вы не перегружаете старой историей, потому что она должна быть одинаковой, и C, которая является главой филиала в новом репо, который вы хотите переделать на это, вероятно, master.

Ваши репозитории могут быть сложнее t han, и вам, возможно, потребуется больше работы, чтобы выяснить, где именно шов для воссоединения, но это общая идея. Теперь вы можете git remote rm newrepo, «newrepo» - это то, что вы назвали удаленным при его добавлении. Это должно устранить второй корень и все взятые на себя обязательства. Наконец, вы можете принудительно нажать это на github. Это изменит буквально каждый хеш фиксации, поэтому ни одна из вилок не будет работать, но у вас будет вся история, и люди могут просто клонировать снова или reset --hard в новый master, чтобы уловить резервную копию. Вы, вероятно, захотите сообщить об этом всем на своей странице репо и, возможно, найти людей, которые разветвляли и предупреждали их о ваших намерениях.