Как преобразовать обычный репозиторий 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

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

Ответ 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, голый репо.