Я обычно работаю на удаленном сервере через ssh (screen и vim), где у меня есть Git-репозиторий. Иногда я не в сети, поэтому у меня есть отдельный репозиторий (клонированный с моего пульта) на моем ноутбуке.
Однако я не могу извлечь из этого хранилища на удаленной стороне, потому что я обычно за брандмауэром или у меня нет общедоступного IP-адреса.
Я читал, что я должен нажать только на пустой репозиторий. Как мне затем отправить свои изменения в мой удаленный репозиторий?
git pull github master
.Ответы:
receive.denyCurrentBranch updateInstead
Эта опция была добавлена в Git 2.3 , и она заставляет сервер обновлять свое рабочее дерево, если оно чистое.
Таким образом, если вы гарантируете, что всегда выполняете коммит, прежде чем извлекать локально, и сохраняете чистое рабочее дерево на сервере (что вы должны делать, чтобы избежать конфликтов слияния), то этот вариант является хорошим решением.
Пример использования:
Вывод:
источник
--local
необязательным?--local
влияет только на текущий каталог,--global
влияет на все репозитории git~/.gitconfig
, смman git-config
.Лучший вариант
Вероятно, самый чистый, наименее запутанный и безопасный способ проникновения в удаленный репозиторий без обнажений - это переход к выделенным веткам на удаленном устройстве, которые представляют ветви вашего ноутбука.
Давайте рассмотрим простейший случай и предположим, что в каждом репо есть только одна ветвь: master. Когда вы нажимаете на удаленное репо с вашего ноутбука, вместо нажатия master -> master, push master -> laptop-master (или аналогичное имя). Таким образом, push не влияет на текущую извлеченную главную ветку в удаленном репо. Чтобы сделать это с ноутбука, команда довольно проста:
Это означает, что локальная главная ветвь будет помещена в ветку с именем «ноутбук-мастер» в удаленном хранилище. В вашем удаленном репо у вас будет новая ветвь с именем «ноутбук-мастер», которую вы сможете объединить с вашим удаленным мастером, когда будете готовы.
Альтернативный вариант
Также возможно просто нажать master -> master, но обычно не рекомендуется отправка в текущую извлеченную ветвь непроигранного репо, потому что это может сбить с толку, если вы не понимаете, что происходит. Это связано с тем, что отправка в извлеченную ветвь не обновляет рабочее дерево, поэтому проверка
git status
в извлеченной ветке, в которую была вставлена, покажет в точности противоположные отличия от того, что было добавлено совсем недавно. Было бы особенно запутанно, если бы дерево работ было грязным до того, как был сделан пуш, что является большой причиной, почему это не рекомендуется.Если вы хотите попробовать нажать master -> master, то команда будет просто:
Но когда вы вернетесь к удаленному репо, вам, скорее всего, понадобится выполнить
git reset --hard HEAD
синхронизацию рабочего дерева с загруженным контентом. Это может быть опасно , потому что, если в удаленном рабочем дереве есть какие-то незафиксированные изменения, которые вы хотели бы сохранить, оно уничтожит их. Убедитесь, что вы знаете, каковы последствия этого, прежде чем попробовать, или, по крайней мере, сначала сделайте резервную копию!РЕДАКТИРОВАНИЕ Начиная с Git 2.3, вы можете использовать «push-to-deploy» git push: https://github.com/blog/1957-git-2-3-has-been-released . Но лучше перейти к отдельной ветви, а затем к слиянию, поскольку оно выполняет фактическое слияние (следовательно, работает с незафиксированными изменениями, как слияние).
источник
git config receive.denyCurrentBranch ignore
это должно быть сделано до того, как выgit push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
Я бы посоветовал иметь на вашем сервере репозиторий с открытым исходным кодом и локальные рабочие репозитории (не открытые). Вы можете перенести изменения с портативного репозитория на сервер, а затем перенести репозиторий из этого репозитория в рабочий репозиторий сервера. Причина, по которой я это говорю, заключается в том, что у вас может быть много полных / неполных веток на сервере, которые вы захотите скопировать на ноутбуке.
Таким образом, вам не нужно беспокоиться о состоянии ветки, проверенной на рабочем репо сервера, при отправке изменений на сервер.
источник
Другой вариант - настроить обратный ssh-туннель, чтобы вы могли тянуть вместо push.
И если вы хотите, чтобы туннель работал в фоновом режиме
источник
Ты можешь сделать:
$git config --bool core.bare true
это можно сделать в голом или центральном репозитории, чтобы он принимал любые файлы, которые были извлечены из не голых репозиториев. Если вы сделаете это в не голом репозитории, то мы не сможем переместить какие-либо файлы из не голого репозитория.
Если вы практикуете GIT, создавая центральное и не обнаженное репо на ПК, он может не показывать загруженные файлы на некоторых ПК, но он был перенесен. Вы можете проверить это, запустив.
$git log
в центральном репо.Если вы не нажмете на GitHub, он покажет файлы там.
источник