2009-03-26 2 views
26

У меня есть два разных экспорта нашего репозитория CVS в git. В какой-то момент они расходятся, и я изучаю почему. Линия развития насчитывает несколько десятков тысяч месяцев.Как сравнить два репозитория git?

В начале строки разработки идентификаторы SHA1 для каждой фиксации идентичны, сообщая мне, что git-cvsimport очень согласуется с тем, что он делает, когда он считывает результаты cvsps и импорта.

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

ответ

16

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

+0

Это на самом деле то, что я сделал вчера, хотя сегодня я немного улучшился с некоторыми предложениями из других ответов. – skiphoppy

+3

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

+0

Извините, но это не тот вопрос. Вопрос в том, как вы сравниваете два репозитория. Ответ ниже. – awm

6

Очевидным способом было бы клонировать один репозиторий, забрать кончик основной ветви другого репозитория в клон и использовать git merge-base на двух подсказках, чтобы найти общего предка.

30

Поскольку два репозитория git начинаются одинаково, вы можете вытащить оба в один и тот же рабочий репозиторий.

$ git remote add cvsimport-a git://.../cvsimport-a.git 
$ git remote add cvsimport-b git://.../cvsimport-b.git 
$ git remote update 
$ git log cvsimport-a/master..cvsimport-b/master # in B, not in A? 
$ git log cvsimport-b/master..cvsimport-a/master # in A, not in B? 
+0

Возможно, вам понадобится cvsimport-a/master и cvsimport-b/master в этих командах.Кроме того, вы можете сделать «git удаленное обновление» вместо того, чтобы прокладывать путь к xargs git fetch. –

+0

Я изначально собирался написать 'git remote fetch cvsimport-a; git remote fetch cvsimport-b' (не обновляя никаких других пультов), но потом я передумал ... сделал. Git жалуется, если вы оставите/мастер, но он работает. Я изменю его для ясности. Ссылка – ephemient

12

В одном из ваших РЕПО, выполните следующие действия:

$ git remote add other-repo git://.../other-repo.git 
$ git remote update 
$ git log other-repo/master...master 
    # or maybe: 
$ gitk master... other-repo/master 

Это дает симметричную разницу между двумя РЕПО; это показывает вам все совершения, которые находятся в одном репо, но не в другом.

0

Вы можете поместить (извлечь) как репозиториев в одном хранилище, либо новый, либо один из существующих, так как в ответах на ephemient, Чарльз Бейли и Брайан Кэмпбелл. Или вы можете использовать трюк от Tips and Tricks на Git Wiki, или, точнее, вопрос «Как сравнить два локальных репозитория».

Но может быть проще сгенерировать список SHA-1 коммитов в топологическом порядке с использованием «git rev-list» (или «git-log» с соответствующими параметрами) и проверить, насколько они отличаются друг от друга.

+0

«Советы и рекомендации» дает ссылку «Не найдено», она перемещена или ушла? – Chris

+0

Git Wiki сначала переместился с http://git.or.cz на http://git.wiki.kernel.org, но второй после вхождения в kernel.org еще не вернулся (и неизвестно, будет ли он быть там, где-то там, или, может быть, где-то на http://git-scm.com). http://git.wiki.kernel.org находится в режиме только для чтения, поэтому все ссылки изменены. ** Советы и рекомендации ** (aka ** GitTips **) можно найти здесь: https://git.wiki.kernel.org/articles/g/i/t/GitTips_81aa.html –

0

У меня была аналогичная потребность в последнее время. У меня был клонированный удаленный проект, который мне нужно сравнить с текущей скопированной базой кода. Журналы git не были релевантными, потому что коммиты не имели ничего общего, и я не был уверен, что они разветвлены с той же кодовой базы.

Чтобы решить эту проблему, я использовал git в грубой форме. Я скопировал файлы, которые нужно проверить в git repo, а затем проверил git status на список измененных файлов.

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

Смежные вопросы