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

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

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

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

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

Ответы [ 16 ]

560 голосов
/ 04 февраля 2010

Вкратце: замените содержимое 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 в новом месте (см. Ниже).

235 голосов
/ 04 февраля 2010

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

git clone --bare /path/to/repo

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

113 голосов
/ 03 августа 2010

Я думаю, что будет полезна следующая ссылка

GitFaq: Как мне сделать доступным не-голое хранилище голым?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
64 голосов
/ 08 марта 2013

Если вы специально не хотите или не хотите вертеть биты в файловой системе, действительно просто создать пустую версию не пустого хранилища (упомянутое здесь в нескольких других постах) Это часть основной функциональности git:

git clone --bare existing_repo_path bare_repo_path

10 голосов
/ 04 августа 2016

Также рассмотрите возможность использования

git clone --mirror path_to_source_repository

Из документации :

Настройте зеркало исходного хранилища.Это подразумевает --bare.По сравнению с --bare, --mirror не только отображает локальные ветви источника в локальные ветви цели, но и отображает все ссылки (включая удаленные отслеживания, заметки и т. Д.) И устанавливает конфигурацию refspec таким образом, чтобы все эти ссылкиперезаписываются удаленным обновлением git в целевом хранилище.

7 голосов
/ 24 февраля 2016

Я просто хотел отправить в хранилище по сетевому пути, но git не позволил бы мне сделать это, если этот хранилище не было помечено как пустое. Все, что мне было нужно, это изменить его конфигурацию:

git config --bool core.bare true

Нет необходимости возиться с файлами, если вы не хотите содержать их в чистоте.

6 голосов
/ 12 августа 2010

Я прочитал ответы и сделал это:

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

4 голосов
/ 04 ноября 2015

Просто прочитайте

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

В основном это то, на что пытался указать ответ # 42 . Конечно, можно было бы заново изобрести колесо; -)

4 голосов
/ 14 октября 2011

Вот то, что я считаю самым безопасным и простым.Здесь ничего не сказано выше.Я просто хочу увидеть ответ, который показывает безопасную пошаговую процедуру.Вы запускаете одну папку из хранилища (репо), которое вы хотите сделать пустым.Я принял соглашение, подразумеваемое выше, что пустые папки хранилища имеют расширение .git

3 голосов
/ 19 апреля 2015

Вот небольшая функция 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, появится сообщение ОШИБКА и изменения файловой системы не произойдут.

...