Как я предварительно ожидаю историю в репозиторий Мерзавца?

Смотрите на java.sql. Класс PreparedStatement, конкретно функция

http://java.sun.com/javase/6/docs/api/java/sql/PreparedStatement.html#setBinaryStream (интервал, %20java.io. InputStream)

Тогда смотрят на java.sql. Класс ResultSet, конкретно функция

http://java.sun.com/javase/6/docs/api/java/sql/ResultSet.html#getBinaryStream (интервал)

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

Вы могли бы быть более обеспеченной записью, неуклюжей на столбцы свойства в таблице и создании и разложении объекта этим способом вместо этого, для предотвращения этой проблемы с версиями объекта и десериализацией. Или запись свойств в hashmap какое-то, как java.util. Объект свойств и затем сериализация объекта свойств, который крайне маловероятно изменится.

18
задан Peter Mortensen 18 July 2018 в 18:45
поделиться

2 ответа

См. Также: the Как мне повторно воспроизвести свои коммиты из локального репозитория Git поверх проекта, который я разветвил на github.com? вопрос (и мой ответ там) , хотя, я думаю, ситуация немного отличается.


У вас есть как минимум три возможности:

  • Используйте графтов , чтобы соединить две истории, но не переписывайте историю. Это означает, что у вас (и у всех, у кого есть такие же трансплантаты) будет полная история, в то время как у других пользователей будет меньший репозиторий. Это также позволяет избежать проблем с переписанной историей, если кто-то уже начал работать над преобразованным репозиторием с более короткой историей.

  • Используйте графты, чтобы соединить две истории, и проверьте правильность с помощью «git log» или «gitk» (или другой браузер / просмотрщик истории Git), затем перезаписать историю , используя git filter-branch ; затем вы можете удалить файл трансплантата. Это означает, что каждый, кто клонирует (извлекает) из переписанного репозитория, получит полную объединенную историю. Но переписывать историю - это большой отказ, если кто-то уже основал работу на преобразованном репозитории короткой истории (но этот случай может не относиться к вам).

  • Используйте git replace , чтобы объединить две истории. Это позволило бы людям выбирать, хотят ли они полную историю или только текущую, выбирая получение refs / replace / (тогда они получают полную историю) или нет (тогда они получают короткую историю). К сожалению, в настоящее время для этого требуется использовать еще не выпущенную версию Git, используя разрабатываемую («основную») версию или один из кандидатов на выпуск 1.6.5. Иерархия refs / replace / запланирована в грядущей версии Git 1.6.5.


Ниже приведены пошаговые инструкции для всех этих методов: графты (локальные), переписывание истории с помощью графтов, и refs / replace /.

Во всех случаях я предполагаю, что у вас есть как текущая, так и историческая история репозитория в одном репозитории (вы можете добавить историю из другого репозитория, используя git remote add ). Я также предполагаю, что (одна из) веток в репозитории краткой истории называется «master», а ветвь (фиксация) исторического репозитория, к которой вы хотите прикрепить текущую историю, называется «историей». Вам придется подставить свои собственные имена веток (или идентификаторы фиксации).

Поиск фиксации для прикрепления (корень короткой истории)

Во-первых, вам нужно найти коммит (идентификатор SHA-1) в короткой истории, который вы хотите присоединить к полной истории. Это будет первый коммит в короткой истории, то есть корневой коммит (коммит без родителей).

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

$ git rev-list --topo-order master | tail -n 1

(где tail -n 1 используется для получения последнего строка вывода; вам не нужно использовать ее, если ее у вас нет.)

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

$ git rev-list --parents master | grep -v ' '

(где grep -v '' , то есть пробел между одинарными кавычками, используется для фильтрации всех коммитов, у которых есть родители). Затем вы должны проверить (например, " нам нужен SHA-1 фиксации, а не объекта тега). Точно так же, как поиск фиксации для прикрепления, назовем этот идентификатор фиксации TOP. Вы можете сохранить его в переменной оболочки, используя:

$ TOP=$(git rev-parse --verify history^0)

История соединений с использованием файла grafts

Файл grafts, расположенный в .git / info / grafts (вам необходимо создать этот файл, если он не не существует, если вы хотите использовать этот механизм) используется для замены родительской информации для фиксации. Это построчный формат, где каждая строка содержит SHA-1 коммита, который мы хотим изменить, за которым следуют ноль или более списков коммитов, разделенных пробелами, которые мы хотим, чтобы данная фиксация имела в качестве родителей; тот же формат, который выводит " git rev-list --parents ".

Мы хотим, чтобы коммит $ TAIL, у которого нет родителей, имел $ TOP в качестве единственного родителя. Поэтому в файле info / grafts должна быть строка с SHA-1 коммита $ TAIL, разделенная пробелом SHA-1 коммита $ TOP. Для этого вы можете использовать следующую однострочную строку (см. Также примеры в документации git filter-branch ):

$ echo "$TAIL $TOP" >> .git/info/grafts

Теперь вы должны проверить, используя «git log», «git log --graph», "gitk" или другой браузер истории, в котором вы правильно объединили истории.

Перезапись истории в соответствии с файлом графтов

Обратите внимание, что это изменит историю!

Чтобы сделать историю, записанную в файле графтов, постоянной, достаточно использовать "git filter-branch" для перезаписи нужных вам ветвей. Если есть только одна ветвь, которую нужно переписать («master»), это может быть так просто:

$ git filter-branch $TOP..master

(Это обработает только минимальный набор коммитов). Если существует больше ветвей, затронутых историей присоединения, вы можете просто использовать

$ git filter-branch --all

. Теперь вы можете удалить файл графтов. Проверьте, все ли так, как вы хотели, и удалите резервную копию в refs / original / (подробности см. В документации по «git filter-branch»).

Использование refs / replace / Mechanism

Это альтернатива файлу графтов. Он имеет то преимущество, что его можно передавать, поэтому, если вы опубликовали короткую историю и не можете ее переписать (потому что другие основывали свою работу на короткой истории), то использование refs / replace / может быть хорошим решением ... ну, по крайней мере, когда будет выпущен Git версии 1.6.5.

Механизм refs / replace / работает иначе, чем файл grafts: вместо изменения родительской информации вы заменяете объекты. Итак, сначала вам нужно создать объект фиксации, который имеет те же свойства, что и $ TAIL, но имеет $ TOP в качестве родителя.

Мы можем использовать

$ git cat-file commit $TAIL > TAIL_COMMIT

(Имя временного файла является только примером).

Теперь вам нужно отредактировать файл 'TAIL_COMMIT' (он будет выглядеть так):

tree 2b5bfdf7798569e0b59b16eb9602d5fa572d6038
author Joe R Hacker  1112911993 -0700
committer Joe R Hacker  1112911993 -0700

Initial revision of "project", after moving to new repository

Теперь вам нужно добавить $ TOP в качестве родительского, поместив строку с «родительским $ TOP» (где $ TOP нужно расширить до SHA -1 id!) Между заголовком tree и заголовком author. После редактирования 'TAIL_COMMIT' он должен выглядеть так:

tree 2b5bfdf7798569e0b59b16eb9602d5fa572d6038
parent 0f6592e3c2f2fe01f7b717618e570ad8dff0bbb1
author Joe R Hacker  1112911993 -0700
committer Joe R Hacker  1112911993 -0700

Initial revision of "project", after moving to new repository

Если хотите, вы можете отредактировать сообщение фиксации.

Теперь вам нужно использовать git hash-object , чтобы создать новую фиксацию в репозиторий. Вам необходимо сохранить результат этой команды, который является SHA-1 нового объекта фиксации, например, следующим образом:

$ NEW_TAIL=$(git hash-object -t commit -w TAIL_COMMIT)

(Где ' -w '

28
ответ дан 30 November 2019 в 07:44
поделиться

Сначала создайте точку пересадки , чтобы прикрепить две истории. Затем запустите git filter-branch в репозитории, чтобы сделать изменение постоянным. Это изменит идентификаторы всех коммитов после прививки, обратите внимание.

5
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: