Получение рабочей копии пустого хранилища

У меня есть сервер, на котором у меня есть пустой репозиторий для отправки. Тем не менее, мой сервер должен иметь рабочую копию главной ветви.

Как я могу получить рабочую копию и только из чистого хранилища?

8 ответов

Вы можете просто клонировать репозиторий в другой каталог на том же компьютере:

git clone /bare/repo/dir.git

Текущий каталог станет непонятным клоном вашего репозитория, и вы получите master ветвь автоматически. Затем используйте обычные команды, такие как git pull обновить его по мере необходимости.

Как дополнительное преимущество, эта операция очень эффективна - если вы указываете локальный каталог для git clonegit будет пытаться делиться объектами между этими двумя репозиториями, используя жесткие ссылки.

Пустой репозиторий - это просто каталог.git рабочего каталога и запись в локальном конфигурационном файле. Что я сделал, чтобы преобразовать пустой репозиторий в полный:

  • Создать новый подкаталог .git и переместить все файлы из чистого хранилища туда
  • Изменить .git/config файл для изменения bare = true в bare = false
  • Проверьте ветку, которую вы хотите. Это извлекает все файлы из хранилища в рабочий каталог.

Вы можете установить скрытый атрибут на .git каталог на Windows, но не на файлы внутри каталога.

Я искал подход "отдельное рабочее дерево" (как показано здесь):

git init --bare

git config core.bare false
git config core.worktree /somewhere/else/

git checkout -f

Это работает для меня:

git --git-dir=path-to-bare-repo.git --work-tree=path-to-target checkout master .

эта команда извлечет все файлы из репозитория в каталог, указанный path-to-target

Это пустые слова из двух других ответов, но они заполняют пробел для моего варианта использования - он работает для обновления репо из источника и проверки веток и любой операции git, потому что вы в итоге получаете нормальное полное git-репо.

git clone /path/to/bare/repo /new/path/to/full/repo
cd /new/path/to/full/repo
git remote set-url origin git@github.com:swift/swift.git

После выполнения этих 3 строк кода вы можете git pull а также git branch а также git checkout some_branch и так далее, потому что теперь у вас есть нормальное полное git-репо, подключенное к вашему удаленному репо.

Вот как это работает:

$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir
$ cd /path/to/workdir
$ git checkout .

Вуаля!

Для информации: git init сообщит: Reinitialized existing Git repository in /path/to/existing-bare-repository, Но будь уверен. man git-init говорит: Запуск git init в существующем репозитории безопасен. Это не перезапишет то, что уже есть.

Магия в том, что git init само по себе не заставляет ваши файлы появляться в рабочем каталоге. Вы должны оформить заказ в корневом каталоге.

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

https://git-scm.com/docs/git-worktree

он должен позволять создавать локальную рабочую копию из чистого репо без необходимости его клонирования (это может сэкономить место, если репо большое)

Вы можете использовать 'git show' для этого.

http://www.kernel.org/pub/software/scm/git/docs/git-show.html

В принципе:

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file.txt
Другие вопросы по тегам