Как вы используете репозиторий "git --bare init"?



Мне нужно создать центральный репозиторий Git, но я немного запутался...



Я создал голый репозиторий (на моем сервере git, машина 2) с помощью:



$ mkdir test_repo
$ git --bare init


теперь мне нужно нажать файлы из моего локального репозитория (машина 1) в голый репозиторий (машина 2). У меня есть доступ к машине 2 по SSH. Дело в том, что я думаю, что не понимаю концепцию голого хранилища...



Как правильно хранить мой код в голом репозитории? Как можно ли перенести изменения из локального репозитория в пустой репозиторий?



правильно ли иметь центральный репозиторий, чтобы иметь голый репозиторий?



Я немного запутался с этой темой. Пожалуйста, дайте мне ключ к разгадке.

714   10  
git

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.txt

The 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-date

2В. Создать рабочую папку из существующих файлов Если у вас уже есть папка с файлами в ней (поэтому вы не можете клонировать в нее), вы можете инициализируйте новое РЕПО 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 создать каталог для вас:

git init --bare test_repo.git

этого должно быть достаточно:

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

    Ничего не найдено.