Как преобразовать обычный Git-репозиторий в пустой? - PullRequest
565 голосов
/ 04 февраля 2010

Как я могу преобразовать «нормальный» Git-репозиторий в пустой?

Основное различие заключается в следующем:

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

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

Ответы [ 16 ]

1 голос
/ 03 февраля 2017

В случае, если у вас есть хранилище с несколькими локальными извлеченными ветвями / refs / head / * и несколькими удаленными ветвями ветвей remote / origin / * И если вы хотите преобразовать это в хранилище BARE со всеми ветками в / refs /head / *

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

  1. создать пустой репозиторий
  2. перейдите в локальный репозиторий с локальными извлеченными ветвями и удаленными ветвями
  3. git push / path / to / bare / repo + refs / remotes / origin / : refs / Heads /
1 голос
/ 04 июня 2014

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

Первый клон / путь / к / нормальному / репо в голое репо с именем repo.git

git clone --bare /path/to/normal/repo

Затем удалите источник, который указывает на / path / to / normal / repo

cd repo.git
git remote rm origin

Наконец, вы можете удалить исходное репо.В этот момент вы можете переименовать repo.git в repo, но стандартным соглашением для обозначения репозитория git является some.git, так что я бы лично оставил это так.

Как только вы все это сделаете,вы можете клонировать свое новое голое репо (которое фактически создает нормальное репо, а также то, как вы бы конвертировали его из голого в обычное)

Конечно, если у вас есть другие апстримы, вы захотите сделатьобратите внимание на них, и обновите ваш репо, чтобы включить его.Но опять же, все это можно сделать с помощью команды git.Помните, что справочные страницы - ваш друг.

0 голосов
/ 03 января 2017

Я использовал следующий скрипт, чтобы прочитать текстовый файл со списком всех моих репозиториев 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 <prince.rogers.nelson@payesley.park.org>

www-данныеПользователь веб-сервера Apache, необходимо разрешение для передачи изменений по HTTP

0 голосов
/ 01 апреля 2012

Ничего себе, просто удивительно, как много людей вмешалось в это, особенно учитывая, что, похоже, ни один человек не остановился, чтобы спросить, почему этот человек делает то, что он делает.

ЕДИНСТВЕННАЯ разница междуголый и не голый git-репозиторий состоит в том, что у не голой версии есть рабочая копия.Основная причина, по которой вам нужно пустое хранилище, заключается в том, что если вы хотите сделать его доступным для третьей стороны, вы не можете работать с ним напрямую, поэтому в какой-то момент вам придется клонировать его, и в этот момент выВернемся к обычной версии рабочей копии.

При этом для конвертации в чистое репо все, что вам нужно сделать, это убедиться, что у вас нет ожидающих коммитов, а затем просто:

rm -R * && mv .git/* . && rm -R .git

Вот и все, голое репо.

0 голосов
/ 23 февраля 2012

Во-первых, backup существующее хранилище:

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

Во-вторых, выполните следующее:

git clone --bare -l non_bare_repo new_bare_repo
0 голосов
/ 29 июня 2010

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)

...