У меня есть сервер, на котором у меня есть голый репозиторий для отправки. Однако на моем сервере должна быть рабочая копия основной ветки.
Как мне получить рабочую копию и только из голого репозитория?
У меня есть сервер, на котором у меня есть голый репозиторий для отправки. Однако на моем сервере должна быть рабочая копия основной ветки.
Как мне получить рабочую копию и только из голого репозитория?
Вы можете просто клонировать репозиторий в другой каталог на том же компьютере:
git clone /bare/repo/dir
Текущий каталог станет не голым клоном вашего репозитория, и вы автоматически получите проверку ветки master
. Затем используйте обычные команды, такие как git pull
, чтобы обновить его по мере необходимости.
В качестве дополнительного преимущества эта операция очень эффективна — если вы укажете локальный каталог для git clone
, git будет использовать жесткие ссылки для совместного использования доступных только для чтения частей объектных баз данных двух репозиториев.
git pull
. Если вам нужно, чтобы это происходило автоматически, вы можете организовать post-receive
ловушку сервера для запуска git pull
на клоне.
- person user4815162342; 17.09.2012
.git
, и в этом случае git clone /bare/repo/dir
— это все, что вам нужно.
- person here; 18.04.2014
Голый репозиторий — это просто каталог .git рабочего каталога и запись в локальном файле конфигурации. Что я сделал, чтобы преобразовать пустой репозиторий в полный:
.git
и переместите туда все файлы из голого репозитория..git/config
, заменив bare = true
на bare = false
.Вы можете установить атрибут Hidden для каталога .git
в Windows, но не для файлов внутри каталога.
Я искал подход "отдельное рабочее дерево" (как показано здесь):
git init --bare
git config core.bare false
git config core.worktree /somewhere/else/
git checkout -f
core.bare
перед строкой core.worktree
, как отмечено в комментариях к этому сообщению в блоге (и подтверждено мной только что). В противном случае вы получите ошибку fatal: core.bare and core.worktree do not make sense
.
- person craigpatik; 07.02.2014
Это работает для меня:
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 [email protected]: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
сама по себе не заставляет ваши файлы появляться в рабочем каталоге. Вы должны проверить корневой каталог.
Для этого вы можете использовать «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
Также рассмотрите возможность использования
https://git-scm.com/docs/git-worktree
он должен позволять создавать локальную рабочую копию из голого репо без необходимости его клонирования (это может сэкономить место, если репо большое)