Нажмите на не-голый репозиторий Git

Я обычно работаю на удаленном сервере через ssh (screen и vim), где у меня есть репозиторий Git. Иногда я не в сети, поэтому у меня есть отдельный репозиторий (клонированный с моего пульта) на моем ноутбуке.

Однако я не могу извлечь из этого репозитория на удаленную сторону, потому что я обычно за брандмауэром или у меня нет публичного IP-адреса.

Я читал, что я должен просто нажать на пустой репозиторий. Как мне затем нажать мои изменения в моем удаленном репозитории?

Ответ 1

receive.denyCurrentBranch updateInstead, добавлено в Git 2.3, также обновляет дерево работы сервера, если оно чистое.

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

Использование образца:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

Вывод:

a
b

Ответ 2

Лучший вариант

Вероятно, самый чистый, наименее запутанный и безопасный способ проникнуть в ваш небедный удаленный репозиторий - это нажать на выделенные ветки на пульте дистанционного управления, которые представляют ваши ветки вашего ноутбука.

Посмотрим на простейший случай и предположим, что у вас есть только одна ветвь в каждом репо: master. Когда вы нажимаете на дистанционное репо с вашего ноутбука, вместо того, чтобы нажимать master → master, нажимайте master → laptop-master (или аналогичное имя). Таким образом, push не влияет на текущую проверенную ведущую ветвь в удаленном репо. Для этого с ноутбука команда довольно проста:

git push origin master:laptop-master

Это означает, что локальная ведущая ветвь будет перенаправлена ​​в ветвь с именем "laptop-master" в удаленном репозитории. В вашем удаленном репо вы будете иметь новую ветку с именем "laptop-master", которую вы сможете слить в свой удаленный мастер, когда будете готовы.

Альтернативный вариант

Также можно просто нажать master → master, но, как правило, не рекомендуется указывать текущую отмеченную ветку не-голого репо, потому что это может сбивать с толку, если вы не понимаете, что происходит. Это связано с тем, что нажатие на отмеченную ветку не обновляет дерево работы, поэтому проверка git status в отложенной ветки, которая была нажата, покажет точно противоположные различия, как то, что было недавно нажато. Было бы особенно странно, если бы дерево работ было загрязнено до того, как было сделано нажатие, что является большой причиной, почему это не рекомендуется.

Если вы хотите попробовать просто нажать master → master, то команда будет просто:

git push origin

Но когда вы вернетесь к удаленному репо, вы, скорее всего, захотите сделать git reset --hard HEAD, чтобы дерево работы было синхронизировано с содержимым, которое было нажато. Это может быть опасно, потому что, если в удаленном дереве работ есть какие-то незафиксированные изменения, которые вы хотели сохранить, они уничтожат их. Убедитесь, что вы знаете, каковы последствия этого, прежде чем вы попробуете его или, по крайней мере, сделаете резервную копию в первую очередь!

ИЗМЕНИТЬ Начиная с Git 2.3, вы можете использовать "push-to-deploy" Git push: https://github.com/blog/1957-git-2-3-has-been-released. Но нажатие на отдельную ветку, а затем слияние, как правило, лучше, так как оно выполняет фактическое слияние (следовательно, работает с незафиксированными изменениями, как это делает слияние).

Ответ 3

Я бы предложил иметь открытый сервер и локальные (не голые) репозитории на вашем сервере. Вы можете перенаправить изменения с ноутбука на серверное репо, а затем вытащить из этого голого репо серверное рабочее репо. Причина, по которой я говорю это, состоит в том, что на сервере может быть много полных/неполных ветвей, которые вы захотите воспроизвести на ноутбуке.

Таким образом, вам не нужно беспокоиться о том, что состояние ветки проверено на сервере, работающем с репо, при нажатии на изменения на сервере.

Ответ 4

Другой вариант - настроить обратный туннель ssh, чтобы вы могли тянуть вместо нажатия.

# start the tunnel from the natted box you wish to pull from (local)
$ ssh -R 1234:localhost:22 [email protected]

# on the other box (remote)
$ git remote add other-side ssh://[email protected]:1234/the/repo
$ git pull other-side

И если вы хотите, чтобы туннель работал в фоновом режиме

$ ssh -fNnR 1234:localhost:22 [email protected]