Скопируйте 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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.