Скопируйте 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
Но я бы на вашем месте не стал делать этот последний шаг, так как это вызовет проблемы у всех, кто в настоящее время использует репозиторий. Вместо этого просто переключитесь на использование этой новой ветки (возможно, с более подходящим названием) и не публикуйте старую.
Разве это не то, что делает сжатие перебазирования? Просто раздавите все, кроме последней фиксации, а затем нажмите (принудительно).