Получение рабочей копии пустого хранилища
У меня есть сервер, на котором у меня есть пустой репозиторий для отправки. Тем не менее, мой сервер должен иметь рабочую копию главной ветви.
Как я могу получить рабочую копию и только из чистого хранилища?
8 ответов
Вы можете просто клонировать репозиторий в другой каталог на том же компьютере:
git clone /bare/repo/dir.git
Текущий каталог станет непонятным клоном вашего репозитория, и вы получите master
ветвь автоматически. Затем используйте обычные команды, такие как git pull
обновить его по мере необходимости.
Как дополнительное преимущество, эта операция очень эффективна - если вы указываете локальный каталог для git clone
git будет пытаться делиться объектами между этими двумя репозиториями, используя жесткие ссылки.
Пустой репозиторий - это просто каталог.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