Как преобразовать обычный репозиторий Git в голый?
Как я могу конвертировать "нормальный" Git репозиторий на один?
Основное отличие:
-
в обычном репозитории Git у вас есть папка .git
внутри репозитория, содержащая все соответствующие данные, а все остальные файлы создают вашу рабочую копию
-
в голом репозитории Git нет рабочей копии, а папка (пусть ее вызывает repo.git
) содержит фактические данные репозитория
Ответы
Ответ 1
Вкратце: замените содержимое repo
на содержимое repo/.git
, а затем сообщите репозиторию, что он теперь является открытым репозиторием.
Для этого выполните следующие команды:
cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true
Обратите внимание, что это отличается от выполнения git clone --bare
в новом месте (см. ниже).
Ответ 2
Ваш метод выглядит так, как будто он работает; файловая структура открытого репозитория - это то, что находится внутри каталога .git. Но я не знаю, действительно ли какой-либо файл был изменен, поэтому, если это не удается, вы можете просто сделать
git clone --bare /path/to/repo
Вам, вероятно, понадобится сделать это в другом каталоге, чтобы избежать конфликта имен, а затем вы можете просто переместить его туда, где хотите. И вам может потребоваться изменить файл конфигурации, чтобы указать, где бы вы не отправляли свое репо.
Ответ 3
Я думаю, что следующая ссылка была бы полезной
GitFaq: Как сделать существующий не-голый репозиторий открытым?
$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
Ответ 4
Если вы специально не нуждаетесь или не нуждаетесь в перекручивании битов в файловой системе, действительно просто создать голой вариант не-голого репозитория (упомянутый здесь в нескольких других сообщениях). Его часть функциональности git s:
git clone --bare reponame bare_reponame
Ответ 5
Я просто хотел нажать на репозиторий по сетевому пути, но git не разрешил бы мне это делать, если только этот репозиторий не был помечен как голый.
Все, что мне было нужно, это изменить его конфигурацию:
git config --bool core.bare true
Не нужно возиться с файлами, если вы не хотите, чтобы он был чистым.
Ответ 6
Просим также использовать
git clone --mirror path_to_source_repository
В документации :
Настройте зеркало исходного репозитория. Это означает -. По сравнению с --bare, --mirror не только отображает локальные ветки источника в локальные ветки объекта, он отображает все ссылки (включая ветки удаленного отслеживания, заметки и т.д.) И устанавливает конфигурацию refspec, так что все эти ссылки перезаписываются удаленным обновлением git в целевом репозитории.
Ответ 7
Я прочитал ответы, и я сделал это:
cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like
это оставит содержимое repos/.git
как голый repos.git
Ответ 8
Вот то, что я считаю самым безопасным и простым. Здесь ничего не сказано выше. Я просто хочу увидеть ответ, который показывает безопасную пошаговую процедуру. Вы запускаете одну папку из репозитория (репо), который вы хотите обнажить. Я принял соглашение, подразумеваемое выше, что в папках с открытым хранилищем есть расширение .git.
(1) Backup, just in case.
(a) > mkdir backup
(b) > cd backup
(c) > git clone ../repo
(2) Make it bare, then move it
(a) > cd ../repo
(b) > git config --bool core.bare true
(c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
(a) > cd ..
(b) > mkdir test
(c) > cd test
(d) > git clone ../repo.git
(4) Clean up
(a) > rm -Rf repo
(b) (optional) > rm -Rf backup/repo
(c) (optional) > rm -Rf test/repo
Ответ 9
Просто прочитайте
Pro Git Книга: 4.2 Git на сервере - Получение Git на сервере
которые сводятся к
$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
Затем поместите my_project.git на сервер
Что в основном, какой ответ # 42 пытался указать. Как можно было бы изобрести колесо, -)
Ответ 10
Вот небольшая функция BASH, которую вы можете добавить в ваш .bashrc или .profile в системе на базе UNIX. После добавления и перезапуска оболочки перезагружается через вызов source ~/.profile
или source ~/.bashrc
.
function gitToBare() {
if [ -d ".git" ]; then
DIR="`pwd`"
mv .git ..
rm -fr *
mv ../.git .
mv .git/* .
rmdir .git
git config --bool core.bare true
cd ..
mv "${DIR}" "${DIR}.git"
printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
printf "bare and renamed to\n ${DIR}.git\n"
cd "${DIR}.git"
else
printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
fi
}
После вызова внутри каталога, содержащего каталог .git, он внесет соответствующие изменения для преобразования репозитория. Если при вызове нет каталога .git, появится сообщение FAILURE, и никаких изменений файловой системы не произойдет.
Ответ 11
Способы удаления файлов и гашения при перемещении каталога .git не являются чистыми и не используют метод "git" для выполнения чего-то, что должно быть простым. Это самый чистый метод, который я нашел, чтобы преобразовать нормальное репо в голый репо.
Первый клон/путь/в/нормальный/репо в голое репо с именем repo.git
git clone --bare /path/to/normal/repo
Затем удалите начало, которое указывает на /path/to/normal/repo
cd repo.git
git remote rm origin
Наконец, вы можете удалить свое оригинальное репо. Вы могли бы переименовать repo.git для репо в этот момент, но стандартное соглашение о значении репозитория git - это что-то., Поэтому я лично оставил бы его таким образом.
После того, как вы все это сделали, вы можете клонировать новое голое репо (которое фактически создает нормальное репо, а также то, как вы конвертируете его с нуля на нормальный)
Конечно, если у вас есть другие восходящие потоки, вы захотите их записать и обновите свое голого репо, чтобы включить его. Но опять же, все это можно сделать с помощью команды git. Помните, что страницы ваших персонажей - ваш друг.
Ответ 12
Если у вас есть репозиторий с несколькими локальными ветвями проверки /refs/heads/ * и несколькими удаленными ветвями ветвей remotes/origin/* И если вы хотите преобразовать это в репозиторий BARE со всеми веткими в /refs/heads/ *
вы можете сделать следующее, чтобы сохранить историю.
- создать голый репозиторий
- cd в локальный репозиторий с локальными ветвями проверки и удаленными ветвями.
- git push/path/to/bare/repo + refs/remotes/origin/: refs/heads/
Ответ 13
Я использовал следующий script для чтения текстового файла, который имеет список всех моих SVN-репозиториев и конвертирует их в GIT, а затем использует git clone --bare для преобразования в голый git репо
#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
printf '%s\n' "$repo_name"
sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
sudo git clone --bare /programs/git/$repo_name $repo_name.git
sudo chown -R www-data:www-data $repo_name.git
sudo rm -rf $repo_name
done <"$file"
list.txt имеет формат
repo1_name
repo2_name
и users.txt имеет формат
(no author) = Prince Rogers <[email protected]>
www-data - пользователь веб-сервера Apache, требуется разрешение для изменения изменений по HTTP
Ответ 14
Во-первых, backup
ваше существующее репо:
(a) mkdir backup
(b) cd backup
(c) git clone non_bare_repo
Во-вторых, запустите следующее:
git clone --bare -l non_bare_repo new_bare_repo
Ответ 15
Oneliner для выполнения всех вышеперечисленных операций:
for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true
(не обвиняйте меня, если что-то взорвалось, и у вас не было резервных копий: P)
Ответ 16
Ничего себе, это просто удивительно, как много людей подшучивают над этим, особенно учитывая, что не кажется, что ни один не остановился, чтобы спросить, почему этот человек делает то, что он делает.
Единственная разница между голым и не-голым репозитаром git заключается в том, что у не-голой версии есть рабочая копия. Основная причина, по которой вам понадобится голый репо, - если вы хотите сделать ее доступной для третьей стороны, вы не можете на самом деле работать над ней напрямую, поэтому в какой-то момент вам придется клонировать ее, в какой момент вы находитесь вернемся к обычной версии рабочей копии.
При этом, чтобы преобразовать в голый репо все, что вам нужно сделать, это убедиться, что у вас нет ожидающих коммитов, а затем просто:
rm -R * && mv .git/* . && rm -R .git
Там ya go, голый репо.