Вклад с открытым исходным кодом с локальным центральным репозиторием и двумя машинами разработчика

Я хочу внести свой вклад в проекты с открытым исходным кодом. Я работаю и живу в двух разных местах. У меня есть настройка VPN с локальным центральным репозиторием (в моей домашней сети), доступным из обоих мест. У меня есть 2 настольных компьютера для разработчиков.

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

Возьмем для примера проект с открытым исходным кодом на Gitlab. Я делаю git clone https://gitlab.example.com/opensource.git на своем центральном сервере, а затем создаю там ветку git checkout -b new_feature. Затем я клонирую его на оба настольных компьютера через git clone central-server:/srv/data/Git/opensource на обоих настольных компьютерах. Я разработал и зафиксировал изменения локально на одной из моих машин разработчика. Когда я пытался внести изменения, я получаю сообщение об ошибке, см. Ниже. Я тоже пробовал пустой репозиторий, но тоже получал сообщения об ошибках. Когда я реализовал изменение и провел тест, я хочу отправить изменения с моего центрального сервера в репозиторий Gitlab.

Вопрос: какой рабочий процесс и какие команды git здесь лучше всего?

[user@laptop src]$ git branch
* new_feature
  master
[user@laptop src]$ git status
On branch new_feature
Your branch is ahead of 'origin/new_feature' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
[user@laptop src]$ git push
Enumerating objects: 22, done.
Counting objects: 100% (22/22), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 1.90 KiB | 1.90 MiB/s, done.
Total 13 (delta 11), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/new_feature
remote: error: By default, updating the current branch in a non-bare repository
remote: is denied, because it will make the index and work tree inconsistent
remote: with what you pushed, and will require 'git reset --hard' to match
remote: the work tree to HEAD.
remote: 
remote: You can set the 'receive.denyCurrentBranch' configuration variable
remote: to 'ignore' or 'warn' in the remote repository to allow pushing into
remote: its current branch; however, this is not recommended unless you
remote: arranged to update its work tree to match what you pushed in some
remote: other way.
remote: 
remote: To squelch this message and still keep the default behaviour, set
remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To central-server:/srv/data/Git/opensource
 ! [remote rejected] new_feature -> new_feature (branch is currently checked out)
error: failed to push some refs to 'central-server:/srv/data/Git/opensource'
[user@laptop src]$ 
stackoverflow.com/…
phd 10.09.2018 10:02

Дело не в сообщении об ошибке, а в наличии локального сервера, на который я сначала отправляю свои коммиты, а затем, наконец, отправляю изменения на сервер Gitlab.

Martin Sand 10.09.2018 11:37
1
3
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы инициализировали свой удаленный репозиторий как стандартный (с рабочим пространством) и пытаетесь в него нажать.

Другими словами, внутри central-server:/srv/data/Git/opensource находится папка .git. Вам нужно создать голый репозиторий:

central-server:/srv/data/Git$ git clone --bare ./opensource opensource_bare
laptop:~$ git clone central-server:/srv/data/Git/opensource_bare <somewhere>
laptop:~$ <work on your new clone here>
laptop:~$ git push 

Поскольку комментарии - не лучшее место для ответов, я бы сделал следующее. Предположим, у вас есть 4 машины:

  • ноутбук1
  • ноутбук2
  • центральный сервер
  • gitlab-сервер

Laptop1 и laptop2 будут иметь клоны репозитория с двумя настроенными удаленными репозиториями (git remote add ...):

  • центральный сервер
  • gitlab-сервер

Всякий раз, когда вы хотите отправить что-то, что «готово», вы отправляете его на gitlab-server. Когда бы вы ни захотели продвинуть незавершенную работу, вы можете использовать центральный сервер. Последний можно использовать для синхронизации работы между ноутбуком1 и ноутбуком2.

Слияние всегда выполняется на клонах, поэтому только на ноутбуке1 и ноутбуке2. central-server будет использоваться только как дополнительный удаленный репозиторий, доступный как с портативного компьютера1, так и с портативного компьютера2.

Большое спасибо. Я попробую, когда буду дома. Куда мне перейти? Я предполагаю на центральном сервере?

Martin Sand 10.09.2018 09:53

Похоже, я не могу создать ветку на своем центральном сервере. И, кроме того, в нем есть все ветки репозитория Gitlab с открытым исходным кодом.

Martin Sand 10.09.2018 11:35

Ни одна из вышеперечисленных команд не создала ответвления. Сначала лайк создал голую версию репозитория, на которую можно было нажать. Ветви могут быть созданы на машине laptop и отправлены в источник (central-server:/srv/data/Git/opensource_bare).

Marcin Pietraszek 10.09.2018 12:36

Так что загрузите на голое, клонируйте на 2 машины разработчика и создайте там ветку, зафиксируйте и отправьте ветку на локальный сервер. На практике, где бы вы сделали слияние, прежде чем переходить к репозиторию Gitlab в Интернете, на машине разработчика или на локальном сервере?

Martin Sand 10.09.2018 13:13

Другие вопросы по теме