Как преобразовать обычный репозиторий Git в голый?



Как я могу преобразовать "обычный" репозиторий Git в голый?



основное различие, кажется:




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


  • в голом репозитории Git нет рабочей копии и папки (назовем ее repo.git) содержит фактические данные репозитория


849   16  

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 на сервере

который сводится к

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.
поставить my_project.ГИТ сервер

что в основном и есть, какой ответ #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/*

вы можете сделать следующее, чтобы сохранить историю.

  1. создать "голый" репозиторий
  2. cd в локальный репозиторий, который имеет локальные проверенные ветви и удаленные ветви
  3. 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

    Ничего не найдено.