Как я могу сказать Git Clone не запускать мой .bashr c? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать репозиторий git, который можно клонировать с помощью S SH с другого сервера. Чтобы проверить, я:

на SERVER_1:

  1. Создать папку /path/to/test.git.
  2. Chmod разрешений на 770 / и g + s
  3. перейдите на test.git и запустите git init --bare --shared=0660

Все еще на SERVER_1:

  1. перейдите в другое место и git clone /path/to/test.git.
  2. Успех! Зафиксируйте несколько новых файлов и наберите pu sh up. Также успех.

На SERVER_2:

  1. Открыть Git (Я на Windows, поэтому я использую Git Bash) .
  2. запустить git clone ssh://[username]@[SERVER_1]:/path/to/test.git
  3. получить fatal: protocol error: bad line length character: Hell Unable to write to standard output: The pipe is being closed

Не ожидал этого. Я могу S SH в SERVER_1 через SERVER_2, нет проблем. После небольшой отладки я понимаю, что S SH пытается запустить мой .bashr c (в середине которого есть эхо-выражение "Hello World"). Итак, я предполагаю, что что-то в моем .bashr c мешает здесь.

Мой вопрос: есть ли способ остановить git clone от попытки выполнить мой .bashr c ? Или хотя бы потерпеть неудачу чуть более изящно? Глядя на страницы справки, --server-options=<option> выглядит как место для начала, но я не уверен, что туда вставить.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Ставлю деньги, ваш ~/.bash_profile на этом сервере не проверяет наличие интерактивных входов.

У вас будет строка с командой . ~/.bashrc или source ~/.bashrc, с ~ возможно записано $HOME. Это общий недосмотр, например,

[[ -f ~/.bashrc ]] && . ~/.bashrc

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

[[ $- = *i* && -f ~/.bashrc ]] && . ~/.bashrc

, который гласит: «если в параметрах оболочки есть i, то есть оболочка является интерактивной, и есть ~/.bashrc, отправьте ее.

2 голосов
/ 22 апреля 2020

Нет способа сделать это.

Когда S SH вызывает команду для запроса Git, она делает это с помощью оболочки пользователя. В результате оболочка должна быть достаточно POSIX-совместимой и не должна выводить какие-либо выходные данные при стандартном выводе или стандартной ошибке при неинтерактивном вызове. Вам нужно будет создать собственную версию OpenS SH, которая будет иметь другое поведение (и, следовательно, нарушит совместимость с любой другой реализацией S SH), если вы захотите этого.

Вам потребуется настройте ~/.bashrc или другие файлы запуска, чтобы вообще ничего не печатать при вызове как bash -c 'echo foo' (кроме, конечно, вывода foo). Если это что-то печатает, вам нужно переместить это в ваш ~/.bash_profile или в другое место или перенаправить его вывод на /dev/null, чтобы этого не произошло при неинтерактивных операциях S SH.

...