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

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

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

8 ответов

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

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

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

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

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 вашего хранилища

Удаление .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

Вы можете установить репозиторий GitHub в качестве шаблона (перейдя в настройки и выбрав опцию прямо под именем репозитория). На странице кода появится кнопка с надписью «Использовать этот шаблон». Это копирует все файлы, но удаляет всю историю, и если вы сохраняете исходное репо как приватное, это не показывает никаких подробностей под именем репо (обратите внимание, что оно будет отображаться на вашем сайте, поскольку вы владеете обоими, но не кому-либо другому). Только если репо является общедоступным, ссылка на исходное репо появляется под именем репо.

#!/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

Многие ответы здесь используют который сохраняет последнюю фиксацию (включая сообщение фиксации).

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

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

Но в любом случае, все ответы выше, чтобы свернуть весь репо в один коммит, кажутся чрезмерно сложными, а также будут довольно медленными, включая множество промежуточных каталогов и, возможно, уничтожая всю другую конфигурацию, хранящуюся в .

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

      $ TREE=`git cat-file -p master |sed '1,/^$/s/^tree //p;d;'`
$ COMMIT=`echo Truncated tree | git commit-tree $TREE`
$ git branch truncated-master $COMMIT

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

      $ git branch backup-master-just-in-case-i-regret-it-later master
$ git push -f origin truncated-master:master

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

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

Другие вопросы по тегам