Получение рабочей копии голого репозитория

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

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


person Jonathan Allard    schedule 16.09.2012    source источник


Ответы (8)


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

git clone /bare/repo/dir

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

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

person user4815162342    schedule 16.09.2012
comment
Какие обновления? Клонированный репозиторий — это просто еще один клон, поэтому его рабочее дерево необходимо обновить с помощью git pull. Если вам нужно, чтобы это происходило автоматически, вы можете организовать post-receive ловушку сервера для запуска git pull на клоне. - person user4815162342; 17.09.2012
comment
О да, очевидно. Я слишком много думал о клонах. - person Jonathan Allard; 17.09.2012
comment
Целевой пустой каталог может не заканчиваться на .git , и в этом случае git clone /bare/repo/dir — это все, что вам нужно. - person here; 18.04.2014

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

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

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

person ygoe    schedule 21.07.2016

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

git init --bare

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

git checkout -f
person Jonathan Allard    schedule 22.09.2012
comment
Обратите внимание, что вам нужно запустить core.bare перед строкой core.worktree, как отмечено в комментариях к этому сообщению в блоге (и подтверждено мной только что). В противном случае вы получите ошибку fatal: core.bare and core.worktree do not make sense. - person craigpatik; 07.02.2014
comment
Странно, я тоже: gist.github.com/joallard/8871673. Может быть, поведение в Git изменилось в какой-то момент? - person Jonathan Allard; 08.02.2014
comment
Похоже, это близко к тому, что мне нужно, но ваша ссылка не работает, а приведенные выше команды недостаточно объяснены, чтобы я мог настроить их для своих нужд. Можете ли вы исправить ссылку и / или объяснить, что там происходит? - person Wildcard; 07.12.2015
comment
@Wildcard Напишите мне в чате сегодня днем, я постараюсь разобраться с вами и обновить свой ответ чтобы быть более полным. (В противном случае вы можете оставить мне электронное письмо, оно есть в моем профиле Github) - person Jonathan Allard; 07.12.2015
comment
Спасибо за предложение! :) Думаю, я нашел то, что мне было нужно. Я не нашел его на SO, поэтому после того, как я понял, я написал об этом здесь: - person Wildcard; 08.12.2015
comment
@craigpatik Я понял, что это не имеет смысла, спасибо за ваш комментарий, я отредактировал ответ и поменял рабочее дерево на голое. - person Elijah Lynn; 02.09.2018

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

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

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

person Tomas    schedule 24.03.2020

Это отрывок от двух других ответов, но он заполняет пробел для моего варианта использования - он работает для обновления репо из источника и проверки ветвей и любой операции 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, подключенный к вашему удаленному репозиторию.

person GregT    schedule 09.12.2015
comment
вы единственный, кто упомянул some_branch, вы должны уточнить. Я специально пытался найти пример для ветки, и этот был популярным в Google для ветки и является частью OQ. ... - person blamb; 30.08.2016

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

$ 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 сама по себе не заставляет ваши файлы появляться в рабочем каталоге. Вы должны проверить корневой каталог.

person Adrian W    schedule 26.04.2016
comment
** ПРЕДУПРЕЖДЕНИЕ ** Я только что попробовал это с копией голого репо. Я получил это: $ diff /path/to/the/real/prod/bare/repo.git/config /path/to/the/copy/prod/bare/repo.git/config 4c4,5 ‹ bare = true - -- › bare = false › logallrefupdates = true $ git --version git version 2.20.1 Вы можете использовать копию bare, а не сам bare. - person mpersico; 18.04.2019
comment
Команда преобразует необработанный репозиторий в репозиторий с каталогом извлечения. т.е. репозиторий больше не голый. Итак, ваше наблюдение является предполагаемым результатом этой команды. Но, может быть, это хорошо, чтобы указать на это. Сравните с ответом @jonathan, который дает тот же эффект, явно применяя наблюдаемые вами изменения конфигурации. - person Adrian W; 18.04.2019
comment
Я думал, что идея заключалась в том, чтобы просто получить копию файлов, которые он действительно конвертирует в репо. Теперь я знаю. - person mpersico; 20.04.2019
comment
В моем понимании git голый репо — это репозиторий без рабочего каталога. Если вы прикрепите рабочий каталог к ​​ранее пустому репозиторию, он больше не будет голым, независимо от того, какими средствами вы этого добьетесь. И поскольку OP (@Jonathan) ответил на свой вопрос с помощью я искал подход с отдельным рабочим деревом , это, по-видимому, было его намерением. Я только хотел представить способ, который ИМХО более элегантен, потому что не нужно возиться с битами конфигурации. - person Adrian W; 20.04.2019

Для этого вы можете использовать «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
person Ben Martin    schedule 17.09.2012

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

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

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

person Cristiano Costantini    schedule 26.06.2021