Как преобразовать обычный репозиторий Git в голый?
Как я могу преобразовать "обычный" репозиторий Git в голый?
основное различие, кажется:
в обычном репозитории git у вас есть
.gitпапка внутри репозитория, содержащая все соответствующие данные и все другие файлы создайте свою рабочую копиюв голом репозитории Git нет рабочей копии и папки (назовем ее
repo.git) содержит фактические данные репозитория
16 ответов:
короче говоря: заменить содержимое
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на новое место (см. ниже).
ваш метод выглядит так, как будто он будет работать; файловая структура голого репозитория-это то, что находится внутри .каталог git. Но я не знаю, если какой-либо из файлов на самом деле изменены, так что если это не удается, вы можете просто сделать
git clone --bare /path/to/repoвероятно, вам нужно будет сделать это в другом каталоге, чтобы избежать конфликта имен, а затем вы можете просто переместить его туда, где хотите. И вам может потребоваться изменить файл конфигурации, чтобы указать, где находится ваше исходное РЕПО.
Я думаю, что следующая ссылка будет полезна
GitFaq: как сделать существующий не-голый репозиторий голым?
$ mv repo/.git repo.git $ git --git-dir=repo.git config core.bare true $ rm -rf repo
Если вы специально не хотите или не должны крутить биты в файловой системе, действительно очень просто создать голую версию не-голого репозитория (упомянутого в нескольких других сообщениях здесь). Это часть основной функциональности git:
git clone --bare reponame bare_reponame
Я просто хотел нажать на репозиторий по сетевому пути, но git не позволил бы мне сделать это, если бы этот репозиторий не был отмечен как голый. Все, что мне нужно было изменить его конфигурацию:
git config --bool core.bare trueНе нужно возиться с файлами, если вы хотите, чтобы держать его в чистоте.
Пожалуйста, также рассмотрите возможность использования
git clone --mirror path_to_source_repositoryС документация:
настройка зеркала исходного репозитория. Это подразумевает -- голый. По сравнению с --bare, -- mirror не только отображает локальные ветви источника в локальные ветви цели, он отображает все ссылки (включая удаленные ветви отслеживания, заметки и т. д.) и настраивает конфигурацию refspec таким образом, что все эти ссылки перезаписываются удаленным обновлением git в целевом объекте хранилище.
Я прочитал ответы, и я сделал это:
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
вот что я считаю самым безопасным и простым. Здесь нет ничего не изложенного выше. Я просто хочу увидеть ответ, который показывает безопасную пошаговую процедуру. Вы запускаете одну папку из репозитория (РЕПО), который хотите сделать голым. Я принял Конвенцию, подразумевающую выше, что голые папки репозитория имеют А.расширение ГИТ.
(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
просто читать
Pro Git Book: 4.2 Git на сервере-получение Git на сервере
который сводится к
поставить my_project.ГИТ сервер$ git clone --bare my_project my_project.git Cloning into bare repository 'my_project.git'... done.что в основном и есть, какой ответ #42 пытался указать. Shurely можно было бы изобрести колесо; -)
вот небольшая функция BASH, которую вы можете добавить к своей .bashrc или .профиль в системе на базе 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 присутствует при вызове, появится сообщение об ошибке и никаких изменений файловой системы не произойдет.
методы, которые говорят, чтобы удалить файлы и гадить с перемещением.каталог git не чист и не использует метод "git" для выполнения чего-то, что должно быть простым. Это самый чистый метод, который я нашел для преобразования обычного РЕПО в голое РЕПО.
первый клон / путь/к / нормальному / РЕПО в голое РЕПО, называемое РЕПО.ГИТ
git clone --bare /path/to/normal/repoзатем удалите начало координат, которое указывает на /path/to / normal / repo
cd repo.git git remote rm originнаконец, вы можете удалить свой оригинальное РЕПО. Вы можете переименовать РЕПО.git для РЕПО в этот момент, но стандартное соглашение для обозначения репозитория git-это что-то.ГИТ, так что я лично оставлю это так.
после того, как вы все это сделали, вы можете клонировать свое новое голое РЕПО (которое фактически создает нормальное РЕПО, а также то, как вы бы преобразовали его из голого в нормальное)
конечно, если у вас есть другие восходящие потоки, вы захотите их отметить и обновить свое голое репо, чтобы включить его. Но опять же, это все это можно сделать с помощью команды git. Помню страницы вашего друга.
Если у вас есть репозиторий с несколькими локальными проверенными ветвями / refs/ heads/* и несколькими удаленными ветвями филиалов remotes/ origin /* и если вы хотите преобразовать это в голый репозиторий со всеми ветвями в/refs/heads/*
вы можете сделать следующее, чтобы сохранить историю.
- создать "голый" репозиторий
- cd в локальный репозиторий, который имеет локальные проверенные ветви и удаленные ветви
- git push / path / to / bare / repo + refs / remotes / origin/: refs / heads/
я использовал следующий скрипт для чтения текстового файла, который имеет список всех моих репозиториев 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"список.txt имеет формат
repo1_name repo2_nameи пользователей.txt имеет формат
(no author) = Prince Rogers <[email protected]>www-data-это пользователь веб-сервера Apache, разрешение необходимо для передачи изменений через HTTP
первый,
backupваш существующий РЕПО:(a) mkdir backup (b) cd backup (c) git clone non_bare_repoво-вторых, выполните следующее:
git clone --bare -l non_bare_repo new_bare_repo
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)
Вау, это просто удивительно, как много людей вмешались в это, особенно учитывая, что кажется, что ни один из них не остановился, чтобы спросить, почему этот человек делает то, что он делает.
единственное различие между голым и не-голым репозиторием git заключается в том, что не-голая версия имеет рабочую копию. Основная причина, по которой вам понадобится голое РЕПО, - это если вы хотите сделать его доступным для третьей стороны, вы не можете работать над ним напрямую, поэтому в какой-то момент вам придется клонируйте его, и в этот момент вы вернетесь к обычной рабочей версии копии.
как говорится, чтобы преобразовать в голое РЕПО все, что вам нужно сделать, это убедиться, что у вас нет ожидающих коммитов, а затем просто :
rm -R * && mv .git/* . && rm -R .gitвот так, голый РЕПО.
Comments