Скопируйте Git-репо без истории

200

В настоящее время у меня есть частный репозиторий на github, который я хочу опубликовать. Однако некоторые из первоначальных коммитов содержат информацию, которую я не хочу обнародовать (жестко закодированные записи и т. Д.).

Какой самый простой способ сделать последний коммит публичным (мне на самом деле не нужны или не нужны предыдущие коммиты в публичном репозитории) без включения какой-либо части или всей истории коммитов?

Рейф
источник
Почему бы вам просто не создать новый репозиторий?
Стефан
2
@Stephan У меня все хорошо, я создаю новый репозиторий, но как мне получить последнее состояние из старого репозитория и зафиксировать его в новом?
Rafe
19
Вы можете просто удалить папку .git и снова выполнить git init для папки, в которой находятся ваши источники
Stephan
2
Удаление папки .git сделает ваши два репозитория несовместимыми, вы не сможете объединиться из одного в другое
Арнольд Роа
Вы не можете перебазировать это? Вы буквально просто раздавили все старые коммиты и затем (силой) нажали.
xaxxon

Ответы:

322

Вы можете ограничить глубину истории при клонировании :

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

Используйте это, если вы хотите ограниченную историю, но все же немного.

Готье
источник
41
Дайте этому человеку печенье (в виде пометки этого ответа правильно) :)
FateNuller
7
Это не относится к предполагаемому использованию, подразумеваемому вопросом, который должен быть в состоянии отправить в удаленный общедоступный репозиторий. Пытаясь подтолкнуть результаты мелкого клона в shallow update not allowed.
Брэд Нокс
280

Используйте следующую команду:

git clone --depth <depth> -b <branch> <repo_url>

Куда:

  • depthколичество коммитов, которое вы хотите включить. т.е. если вы просто хотите использовать последний коммитgit clone --depth 1
  • branchИмя удаленной ветви, с которой вы хотите клонировать. т.е. если вы хотите, чтобы последние 3 коммитов masterиспользовались в веткеgit clone --depth 3 -b master
  • repo_url это URL вашего хранилища
Агам Рафаэли
источник
7
На самом деле это тот же ответ, что и у Готье, но более полный и с примером.
Алед
3
В самом деле. Иногда пример того, что нужно. Для меня это прояснение - это то, что прояснило проблему
Агам Рафаэли
3
+1 к основному ответу, но также и к этому за объяснение выбора ветки, к которой вы хотите применить глубину - я знаю, что это часть команды клонирования - но она прекрасно связывает все это в моем простом уме ... а мне нравиться просто
:)
7
Как это отвечает на вопрос? Все это создает локальный клон, но что тогда? Как вы копируете эту локальную копию с ограниченной историей в новое хранилище?
BradDaBug
4
@BradDaBug возвращает правильную точку. Я следовал приведенным выше инструкциям, ограничив глубину до 1, затем изменил удаленное начало и попытался перейти к новому репо. Однако я получил сообщение об ошибке shallow update not allowed. Я нашел этот ответ переполнения стека полезным в этом случае.
Крейг Майлз,
18

Удаление .gitпапки, вероятно, самый простой путь, так как вам не нужна / не нужна история (как сказал Стефан).

Таким образом, вы можете создать новое репо из вашего последнего коммита: ( Как клонировать проект seed / kick-start без всей истории? )

git clone <git_url>

затем удалите .git, а затем запустите

git init

Или, если вы хотите повторно использовать текущий репо: сделать текущий коммит единственным (начальным) коммитом в репозитории Git?

Выполните вышеупомянутые шаги тогда:

git add .
git commit -m "Initial commit"

Нажмите на ваш репо.

git remote add origin <github-uri>
git push -u --force origin master
JW
источник
6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master
Тимо Кранц
источник
2
--depth 1ненужно в этом случае , потому что история также удаляется сrm -rf .git
rayphi
3
Я думаю, что я сделал бы это так:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
Rayphi
11
@rayphi: да, это --depth 1не нужно, но это также безвредно и экономит небольшую пропускную способность сети (в любом случае, нет смысла извлекать историю, которую вы собираетесь удалить)
Сайлас С. Браун
1
Я не рекомендую делать это, если вы хотите, чтобы ваши репозитории были совместимы.
Арнольд Роа
Извлеките .git также удалите все крючки git.
JudaPriest
0

Разве это не то, что делает раздавливание ребаз? Просто раздавите все, кроме последнего коммита, а затем (силой) нажмите его.

xaxxon
источник