2010-01-04 6 views
4

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

+0

Почему это не вариант? Вы все равно сможете нажать на новое репо. Но да, изменение истории создаст новые хеши - это часть криптографической безопасности Git. В противном случае любой может подделать ваше репо и утверждать, что он был идентичен вашему! –

ответ

5

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

1

Я, конечно, что-то отсутствует, но вы не можете использовать что-то вроде:

git log --since="2009-1-1" -p 

Чтобы извлечь только коммиты после определенной даты или:

git log -p 18f822e..HEAD 

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

+0

Он написал «историю», но текст означает, что он означает «частичный репозиторий». – gimpf

4

Ben James' комментарий точный. Однако то, что вы можете сделать, это запустить новую ветку в вашем текущем репозитории. Оттуда создайте историю этого филиала, как хотите. Когда вы публикуете, удаляйте только эту частную ветку. Это даст вам функциональность, которую вы ищете.

Вот как я только что сделал это в моем тесте:

git branch stackoverflow #Get myself a working branch from current 
git rebase -i deadbeef #0xDEADBEEF is the hex of my first commit 

Сквош все, что вы хотели бы скрыть. Обратите внимание, что git получает PISSED, если у вас есть репозиторий с более чем одним корнем. Это не должно быть возможно, но я только что обнаружил, что через некоторые магические преобразования svn я создал такого зверя.

Проект может также иметь несколько корней, хотя это не является общим (или обязательно хорошей идеей).

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

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