Как вы используете репозиторий "git --bare init"?
Мне нужно создать центральный репозиторий Git, но я немного запутался...
Я создал голый репозиторий (на моем сервере git, машина 2) с помощью:
$ mkdir test_repo
$ git --bare init
теперь мне нужно нажать файлы из моего локального репозитория (машина 1) в голый репозиторий (машина 2). У меня есть доступ к машине 2 по SSH. Дело в том, что я думаю, что не понимаю концепцию голого хранилища...
Как правильно хранить мой код в голом репозитории? Как можно ли перенести изменения из локального репозитория в пустой репозиторий?
правильно ли иметь центральный репозиторий, чтобы иметь голый репозиторий?
Я немного запутался с этой темой. Пожалуйста, дайте мне ключ к разгадке.
10 ответов:
во-первых, просто чтобы проверить, вам нужно изменить в каталог, который вы создали перед запуском
git init --bare. Кроме того, это обычно, чтобы дать голые репозитории расширение.git. Так что вы можете сделатьgit init --bare test_repo.gitдля версий Git
mkdir test_repo.git cd test_repo.git git --bare initчтобы ответить на ваши более поздние вопросы, голые репозитории (по определению) не имеют рабочего дерева, прикрепленного к ним, поэтому вы не можете легко добавлять файлы к ним, как в обычном не-голом репозитории (например с
git add <file>и в последующемgit commit.)вы почти всегда обновляете голый репозиторий, нажимая на него (используя
git push) из другого репозитория.обратите внимание, что в этом случае вам нужно сначала разрешить людям нажимать на ваш репозиторий. Когда внутри
test_repo.git, уgit config receive.denyCurrentBranch ignoreредактировать сообщество
git init --bare --shared=groupкак прокомментировал прасантв, это то, что вы хотите, если вы делаете это на работе, а не для a проект частного дома.
я добавляю этот ответ, потому что после прибытия сюда (с тем же вопросом) ни один из ответов не описывает все необходимые шаги, необходимые для перехода от ничего к полностью используемому удаленному (голому) РЕПО.
Примечание: этот пример использует локальные пути для расположения голого РЕПО, но другие протоколы git (например, SSH, указанный OP) должны работать просто отлично.
я попытался добавить некоторые заметки по пути для тех, кто менее знаком с мерзавец.
1. Инициализируйте голое РЕПО...
> git init --bare /path/to/bare/repo.git Initialised empty Git repository in /path/to/bare/repo.git/это создает папку (РЕПО.ЖКТ) и заполняет его с файлами git, представляющий собой репозиторий Git. В нынешнем виде это РЕПО бесполезно - у него нет коммитов и, что более важно,нет филиалов. Хотя вы можете клонировать это РЕПО, вы не можете вытащить из него.
Далее нам нужно создать рабочую папку. Есть несколько способов сделать это, в зависимости от того, есть ли у вас существующий файл.
2а. Создать новую рабочую папку (не существующие файлы) путем клонирования пустой РЕПО
git clone /path/to/bare/repo.git /path/to/work Cloning into '/path/to/work'... warning: You appear to have cloned an empty repository. done.эта команда будет работать только если
/path/to/workне существует или является пустой папкой. Обратите внимание на предупреждение-на этом этапе у вас все еще нет ничего полезного. Если выcd /path/to/workи работатьgit status, вы получите что-то вроде:On branch master Initial commit nothing to commit (create/copy files and use "git add" to track)но это ложь. Вы на самом деле не на ветке
master(посколькуgit branchвозвращает ничего) и до сих пор нет никаких коммитов.затем скопируйте/переместите / создайте несколько файлов в рабочей папке, добавьте их в git и создайте первую фиксацию.
> cd /path/to/work > echo 123 > afile.txt > git add . > git config --local user.name adelphus > git config --local user.email [email protected] > git commit -m "added afile" [master (root-commit) 614ab02] added afile 1 file changed, 1 insertion(+) create mode 100644 afile.txtThe
git configкоманды нужны только в том случае, если вы еще не сказали git, кто вы. Обратите внимание, что если вы сейчас запуститеgit branch, теперь вы увидитеmasterфилиала в списке. Теперь бегиgit status:On branch master Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup) nothing to commit, working directory cleanэто также вводит в заблуждение-upstream не "ушел", он просто еще не был создан и
git branch --unset-upstreamне поможет. Но это нормально, теперь, когда у нас есть наш первый коммит, мы можем нажать, и мастер будет создан на голом РЕПО.> git push origin master Counting objects: 3, done. Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To /path/to/bare/repo.git * [new branch] master -> master> git pull Already up-to-date. > git push origin master Everything up-to-date2В. Создать рабочую папку из существующих файлов Если у вас уже есть папка с файлами в ней (поэтому вы не можете клонировать в нее), вы можете инициализируйте новое РЕПО git, добавьте первый коммит, а затем свяжите его с голым РЕПО.
> cd /path/to/work_with_stuff > git init Initialised empty Git repository in /path/to/work_with_stuff > git add . # add git config stuff if needed > git commit -m "added stuff" [master (root-commit) 614ab02] added stuff 20 files changed, 1431 insertions(+) create mode 100644 stuff.txt ...на данный момент у нас есть наша первая фиксация и локальная главная ветвь, которую нам нужно превратить в удаленную отслеживаемую восходящую ветвь.
> git remote add origin /path/to/bare/repo.git > git push -u origin master Counting objects: 31, done. Delta compression using up to 4 threads. Compressing objects: 100% (31/31), done. Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done. Total 31 (delta 11), reused 0 (delta 0) To /path/to/bare/repo.git * [new branch] master -> master Branch master set up to track remote branch master from origin.Примечание
-uфлаг на git push для установки (новой) отслеживаемой ветви вверх по течению. Как и раньше, теперь у нас есть полностью функциональное голое РЕПО, которое можно клонировать в другом месте на главной ветви, а также локальную рабочую копию, которая может тянуть и толкать.
отвечая на ваши вопросы один за другим:
"голый" репозиторий-это тот, который имеет не работает дерево. Это означает, что все его содержимое-это то, что у вас есть в .
можно только
commitв "голый" репозиторий наpushing к нему от вашего локального клона. У него нет рабочего дерева, поэтому у него нет измененных файлов, никаких изменений.иметь центральный репозиторий единственный способ это иметь
bareрепозитория.
общая практика заключается в том, чтобы иметь центральный репозиторий, к которому вы нажимаете как голое РЕПО.
Если у вас есть SVN background, вы можете связать SVN repo с Git bare repo. У него нет файлов в РЕПО в исходном виде. В то время как ваш локальный РЕПО будет иметь файлы, которые образуют ваш "код" в дополнение.
вам нужно добавить пульт к голому РЕПО из вашего локального РЕПО и нажать на него свой "код".
Это будет нечто например:
git remote add central <url> # url will be ssh based for you git push --all central
этого должно быть достаточно:
git remote add origin <url-of-bare-repo> git push --all originподробнее "GIT: как обновить мой голый РЕПО?".
Примечания:
- вы можете использовать другое имя, чем '
origin' для голой удаленной ссылки РЕПО.- это не будет толкать ваши теги, вам нужен отдельный
git push --tags originдля этого.
приятно проверить, что код, который вы нажали, действительно был зафиксирован.
вы можете получить журнал изменений в голом репозитории, явно задав путь с помощью параметра --relative.
$ cd test_repo $ git log --relative=/это покажет вам зафиксированные изменения, как если бы это было обычное РЕПО git.
флаг --bare создает репозиторий, который не имеет рабочего каталога. Голый репозиторий является центральным репозиторием, и вы не можете редактировать(хранить) коды здесь, чтобы избежать ошибки слияния.
например, когда вы добавляете файл в свой локальный репозиторий (машина 1) и помещаете его в голый репозиторий, вы не можете видеть файл в голом репозитории, потому что он всегда "пуст". Однако вы действительно нажимаете что-то в репозиторий, и вы можете увидеть его необъяснимо, клонируя другой репозиторий на сервере(машина 2).
как локальный репозиторий на машине 1, так и репозиторий "копия" на машине 2 не являются голыми. связь между голыми и не голыми репозиториями
блог поможет вам понять его. https://www.atlassian.com/git/tutorials/setting-up-a-repository
на основе ответов Mark Longair & Roboprog:
если версия git >= 1.8
git init --bare --shared=group .git git config receive.denyCurrentBranch ignoreили :
если версия git
mkdir .git cd .git git init --bare --shared=group git config receive.denyCurrentBranch ignore
вы можете выполнить следующие команды для инициализации локального репозитория
mkdir newProject cd newProject touch .gitignore git init git add . git commit -m "Initial Commit" git remote add origin user@host:~/path_on_server/newProject.git git push origin masterвы должны работать над проектом из локального репозитория и использовать сервер в качестве центрального репозитория.
вы также можете следовать этой статье, которая объясняет каждый аспект создания и обслуживания репозитория Git. Git для начинающих
Comments