2009-11-19 3 views
114

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

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

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

+0

related: http://stackoverflow.com/questions/12265729/git-config-receive-denycurrentbranch – prusswan

+2

имеют 2 удаленных РЕПО, голые и обычные, и используют крючки. похоже на хлопот, но согласно [git ready] (http://gitready.com/advanced/2009/02/01/push-to-only-bare-repositories.html) и [официальная git wiki] (https : //git.wiki.kernel.org/index.php? title = Git_FAQ & oldid = 23811 # Why_won.27t_I_see_changes_in_the_remote_repo_after_.22git_push.22.3F), вы должны ** просто нажать на голое репо **. вероятно, именно поэтому большинство хостов git repo (например, GitHub, Bitbucket) включают в себя перехваты после приема, поэтому вы можете отправить POST на URL-адрес вашего сервера, который запускает скрипт, который выполняется, например, 'git pull github master'. –

ответ

69

receive.denyCurrentBranch updateInstead, добавлено in 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 
+6

Это действительно должен быть принятый ответ. Это супер просто и отлично работает, как и следовало ожидать. Благодаря! – mav

+1

Отличный способ представления –

+1

Хорошее решение, которое хранит все как есть. –

140

Лучшего вариант

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

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

git push origin master:laptop-master 

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

Альтернативного вариант

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

Если вы хотите попробовать просто толкая мастер -> мастер, то команда просто:

git push origin 

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

EDIT С Git 2.3 вы можете использовать «push-to-deploy» git push: https://github.com/blog/1957-git-2-3-has-been-released. Но нажатие на отдельную ветвь, а затем слияние, как правило, лучше, поскольку оно действительно слияние (следовательно, работает с незафиксированными изменениями, как это делает merge).

+1

Можно ли автоматизировать ветвление после нажатия на ноутбук-мастер? – rdoubleui

+3

@rdoubleui: Вы имели в виду «автоматизировать * слияние»? Если это так, нет, автоматизировать слияние невозможно, поскольку слияния не гарантируются без вмешательства человека. Могут быть конфликты, которые необходимо устранить. –

+0

Я имел в виду «автоматизировать слияние», да. Спасибо, все еще учась. – rdoubleui

13

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

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

+0

Простой. –

1

Другой вариант заключается в установке обратного 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] 
0

Вы можете сделать:

$git config --bool core.bare true

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

Если вы практикуете GIT, создавая центральный и не голый репо на ПК, он может не отображать нажатые файлы на некоторых ПК, но он был нажат. вы можете проверить его, выполнив.

$git log в центральном репо.

Кроме того, если вы нажмете на GitHub, там будут показаны файлы.

Смежные вопросы