Импортировать изменения в репозиторий git из универсального diff
Я пытаюсь импортировать изменения из одной системы контроля версий (проприетарной и сложной) в git-репозиторий. Я делаю это в настоящее время, запустив скрипт, который просто синхронизируется с каждой ревизией по порядку и фиксирует это в репозитории git, но по разным причинам это стало неработоспособным.
Для каждой ревизии я могу получить универсальный дифференциал, описывающий изменение. Мне кажется, что этого должно быть достаточно, чтобы импортировать историю в git, но я не могу понять, как заставить git это делать. Похоже, мне нужно что-то среднее между git-apply и git-fast-import. Возможно, мне следует создать содержимое файла из предыдущей версии и diff, а затем использовать git-fast-import? Или, может быть, я должен отформатировать diff как git patch, сохранить его как файл и использовать git-apply?
У кого-нибудь есть хорошие идеи для меня?
РЕДАКТИРОВАТЬ: причина синхронизации и фиксации стала неосуществимой является двоякой:
Во-первых, сервер поддерживает список файлов, которые вы редактировали. Синхронизация с отредактированными файлами не может быть легко автоматизирована, поэтому я изменяю свои изменения во время обновления. У нас есть система очереди регистрации, которая позволяет вам регистрироваться только тогда, когда ни у кого перед вами нет тех же файлов "на редактировании", что и у вас. Таким образом, снятие файлов с "редактирования" для обновления создает окно, в котором, похоже, люди могут безопасно опередить вас.
Во-вторых, все ветки хранятся в одном и том же хранилище, и мы интенсивно используем ветки. Синхронизация всего проста и работает, синхронизация только одного каталога (из той ветви, в которой я работаю) кажется глючной. Если я синхронизирую все, хотя другие ветки обновляются, когда я не хочу, чтобы они были. Обычно это не было бы проблемой, но у нас есть другой инструмент, который усложняет ситуацию.
2 ответа
Я не знаю, каковы ваши "различные причины, по которым это стало неосуществимым", но я уже довольно давно успешно выполняю эту задачу на работе, поэтому я знаком с ловушками. Хитрость заключается в том, чтобы держать ваш апстрим в отдельной ветке, так что вы всегда можете сделать синхронизацию и git commit
без возникновения конфликтов. Я использую свою главную ветку для этой цели. Мой рабочий процесс для проверки новой функции из ветви функций выглядит примерно так:
- мастер проверки
- синхронизировать с централизованным VCS
- git add -A
- git commit -m "Синхронизировано с апстрима"
- функция git merge
- регистрация в централизованном VCS
- git checkout -b nextfeature
Я не беспокоюсь о получении каждой ревизии от апстрима, но вы можете сделать это, просто выполнив шаги 2-4 для каждой ревизии апстрима.
apply
команда, которая принимает унифицированный diff и применяет его (т. е. "git patch format" не существует, это просто унифицированный diff; такжеgit apply -
с радостью прочтет стандартный ввод, поэтому не нужно ничего сохранять).am
Команда принимает файл в формате mbox с исправлениями, применяет и фиксирует каждое из них. Вы могли бы быть в состоянии легко сгенерировать это; это простоFrom au@th.or Mon, 23 May 2011 14:49:12 +0200 From: au@th.or Date: Mon, 23 May 2011 14:49:12 +0200 Subject: First line of commit message Content-length: <bytes-until-next From> Other lines of commit message --- unified diff
объединены для всех ревизий.
- Это действительно кажется
fast-import
не принимает diffs, но разве вы не можете просто попросить исходную систему предоставить вам содержимое ревизии (которое будет обрабатывать двоичные файлы, для которых не может быть создан унифицированный diff)? Если нет, вы можете спроситьfast-import
чтобы дать вам предыдущий контент (сcat-blob
команда), залатать его и скормить снова.