2016-09-29 3 views
-1

Я понимаю, что сценарий запускается на удаленном репо, но какой контекст выполняет скрипт? Использует ли он ресурсы клиентской машины или ресурсов серверной машины? Или это изменяется в зависимости от того, как клиентское репо связывается с удаленным репо. Кажется, я не могу найти эту информацию официально зарегистрированной где угодно.. Захваты серверной стороны Git иногда не выполняются на стороне сервера?

Edit:

Я должен, вероятно, сформулировал свой вопрос по-другому. Во всяком случае, я просто побежал в это:

https://superuser.com/questions/974337/when-i-run-a-git-hook-in-a-repo-on-a-network-share-which-binaries-are-used

, который упоминает, что «Если это обычный (SMB/CIFS) Доля сети, он выполняется на клиенте.» При выполнении git remote -v из локального репо отображается локальный протокол (файл: //), сопоставленный с исходным кодом, а нажатие на удаленный сетевой ресурс заканчивается использованием Perl на моем клиенте, а не Perl на сервере, проверяется с perl --version. Так что я действительно хотел спросить, дается эта информация, как это может быть, если они являются «серверными» крючками? Не должны ли они ВСЕГДА работать на сервере независимо? Это относится к Windows.

+3

Захваты на стороне сервера на сервере (иначе их можно было бы называть крючками на стороне клиента :-)). Они запускают * после * все новые объекты уже находятся в репозитории. Крюки pre-receive и update запускаются * до того, как будут обновлены любые ссылки, в то время как крюк post-receive запускается * после того, как * все ссылки будут обновлены. – torek

+1

А: если вы нажмете на * локальную * файловую систему ('файл: // foo'), то« сервер »- это ваша собственная машина, то есть клиент - это ваша машина, но так же, как и сервер, поэтому, когда« сервер » «запускает что-то, это ваш клиент делает работу. Я не использую Windows, поэтому я не могу сказать, какие протоколы он может считать «локальными» (* protocol * - это 'https:' или 'ssh:' или 'file:' часть 'https: //host.dom. ain/path' или 'ssh: // host.dom.ain/path' или' file: // path' URL). (Кстати, я не запустил ваш первоначальный вопрос, потому что считаю, что это не очень хорошо документировано.) – torek

+0

Не волнуйтесь, размышляя над тем, как я изначально сформулировал вопрос и прочитал ваш первый комментарий, я понял, как глупо мой вопрос звучал , В любом случае я больше беспокоюсь о получении окончательного ответа. Спасибо, что подтвердили, что он не документирован очень хорошо. Хм, я бы хотел отметить ваш последний комментарий в качестве ответа, но я не думаю, что это возможно. – solstice333

ответ

1

Теперь я понимаю, откуда эта конкретная путаница. Очевидно, что на сервере выполняются «крючки на стороне сервера», но если вы запустите git push на удаленный компьютер, URL которого равен file://... (или только путь, такой как /some/path/to/repo), и на разных серверных перехватах сервер распечатает имя своего хоста или версию программного обеспечения или что-то еще, вы обнаружите, что это версия программного обеспечения вашей собственной машины и т. д.

Фокус в том, что когда вы имеете дело с локальным путем, ваш Git действует как клиент и сервер, говорящий к себе. Это верно, даже если ваша локальная файловая система работает в сети, пока Git видит ее локально. Следовательно, для NFS или CIFS/Samba или (если вы используете такие вещи) монтируете файловую систему Andrew или Plan9 mount или FUSE или что-то еще, до тех пор, пока Git считает, что это обычный обычный файл на вашей собственной машине, Git делает все сервер работает сам, поэтому они все еще локальны.

(На самом деле, если вы запустите ps в системе Unix/Linux, вы увидите, что ваш клиент раздвоенный на git receive-pack процесс:

remote: PID PPID TT STAT  TIME COMMAND 
[snip] 
remote: 28494 27867 4 S+  0:00.06 git push me testbr 
remote: 28495 28494 4 S+  0:00.07 git-receive-pack /home/torek/tmp/t 
remote: 28499 28495 4 S+  0:00.01 /bin/sh hooks/pre-receive 
remote: 28500 28499 4 R+  0:00.00 ps -O ppid 

так что по сути, процесс 28494 является «клиент» здесь, в то время как процесс 28495 является «сервером». Оба они, конечно же, находятся на одном хосте/виртуальной машине/независимо от того, что я установил на удаленный me, чтобы указать здесь file:///home/torek/tmp/t.)

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