git: // протокол заблокирован компанией, как мне обойти это?

188

Попытка что-то вроде git clone git://github.com/ry/node.gitне будет работать, это приводит к:

Initialized empty Git repository in /home/robert/node/.git/
github.com[0: 207.97.227.239]: errno=Connection timed out
fatal: unable to connect a socket (Connection timed out)

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

git submodule update --init --recursive

который пытается использовать протокол git: // и терпит неудачу. Есть ли способ изменить, как эта команда будет работать или что-то?

Роберт
источник
у вас есть доступ по SSH? или просто HTTP?
Пабло Санта Круз
56
Что это с людьми, пытающимися закрыть git вопросы? Согласно FAQ, в сферу SO входят «программные инструменты, обычно используемые программистами». Здесь есть более шести тысяч мерзавцев. Они принадлежат здесь.
Каскабель
9
Вы можете заставить Git автоматически использовать https: // всякий раз, когда он видит git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

Ответы:

426

Если это проблема с вашим брандмауэром, блокирующим порт git: protocol (9418), то вы должны сделать более постоянное изменение, чтобы вам не пришлось забывать выдавать команды, предлагаемые другими постами, для каждого репозитория git.

Приведенное ниже решение также работает только для подмодулей, которые также могут использовать протокол git :.

Поскольку сообщение git на самом деле не указывает сразу на порт 9418, блокирующий брандмауэр, давайте попробуем диагностировать это как реальную проблему.

Диагностика проблемы

Ссылки: https://superuser.com/q/621870/203918 и https://unix.stackexchange.com/q/11756/57414.

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

# Using nmap
# A state of "filtered" against port 9418 (git) means
#   that traffic is being filtered by a firewall
$ nmap github.com -p http,git

Starting Nmap 5.21 ( http://nmap.org ) at 2015-01-21 10:55 ACDT
Nmap scan report for github.com (192.30.252.131)
Host is up (0.24s latency).
PORT     STATE    SERVICE
80/tcp   open     http
9418/tcp filtered git

# Using Netcat:
# Returns 0 if the git protocol port IS NOT blocked
# Returns 1 if the git protocol port IS blocked
$ nc github.com 9418 < /dev/null; echo $?
1

# Using CURL
# Returns an exit code of (7) if the git protocol port IS blocked
# Returns no output if the git protocol port IS NOT blocked
$ curl  http://github.com:9418
curl: (7) couldn't connect to host

Хорошо, теперь мы определили, что наш порт git заблокирован брандмауэром, что мы можем с этим сделать? Читай дальше :)

Основная перезапись URL

Git предоставляет способ переписать URL с помощью git config. Просто введите следующую команду:

git config --global url."https://".insteadOf git://

Теперь, как по волшебству, все команды git будут выполнять замену git://наhttps://

Какие изменения внесла эта команда?

Взгляните на свою глобальную конфигурацию, используя:

git config --list

Вы увидите следующую строку в выводе:

url.https://.insteadof=git://

Вы можете увидеть, как это выглядит в файле, заглянув ~/.gitconfigтуда, где вы должны увидеть, что были добавлены следующие две строки:

[url "https://"]
    insteadOf = git://

Хотите больше контроля?

Просто используйте более полный / конкретный URL в замене. Например, чтобы URL-адреса GitHub использовались только для https: // вместо git: //, вы можете использовать что-то вроде:

git config --global url."https://github".insteadOf git://github

Вы можете запустить эту команду несколько раз, используя различные замены. Однако в случае совпадения URL-адреса с несколькими заменами самое длинное совпадение «выигрывает». Для каждого URL будет сделана только одна замена.

Общесистемные изменения для системных администраторов

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

Просто отредактируйте или добавьте следующее содержимое, /etc/gitconfigи ваши пользователи не должны беспокоиться ни о чем из вышеперечисленного:

[url "https://"]
    insteadOf = git://
Натан Уотсон-Хей
источник
9
Блестящая простота!
Ланс Хант
Прекрасно работает! Больше не нужно искать и заменять. Сценарии сборки просто работают сейчас. Этот ответ сэкономил мне много времени. Спасибо!
Джереми Белл
7
Чтобы немного больше контролировать, какой URL конвертируется, вы также можете указать часть URL. Например: у меня есть частный внутренний сервер myserver.lan.example.com, на котором размещаются git-репозитории по SSH (gitlab), но не по HTTPS. Поэтому я должен использовать SSH, если я хочу воспользоваться удобной аутентификацией ключа. Я также использую репозитории от Github, но мой корпоративный брандмауэр блокирует SSH для Github. Я не хочу просто заменять все экземпляры «git: //» на «https: //», так как это сломало бы gitlab. Решение есть git config --global url."https://github".insteadOf git://github.
clayzermk1
2
Я запускал git изнутри cygwin, и единственный способ заставить это работать - это сделать «Общесистемные изменения для системных администраторов» и добавить изменения «url.https: //.insteadof=git: //» в файл 'C: \ Program Files (x86) \ Git \ etc \ gitconfig'. Спасибо за подсказку!
Крейг
3
Чтобы отменить это изменение можно использоватьgit config --global --unset url."https://".insteadOf
djskinner
29

Github также предоставляет доступ к http (s), который гораздо реже блокируется вашей компанией. Чтобы указать субмодулю использовать это, вы можете сделать это:

git submodule init
git config submodule.<name>.url https://github.com/...
git submodule update

Именно поэтому init и update являются отдельными командами - вы можете инициализировать, настраивать расположение, а затем обновлять. update --initпросто ярлык, когда вам не нужно настраивать любые URL-адреса.

Для всех, кто сталкивается с этим, вы можете, конечно, также использовать ssh URL (если ваша компания блокирует git: // но не ssh), но в этом случае OP, по-видимому, не имеет доступа SSH к удаленному репо.

Cascabel
источник
Похоже, что это будет работать для меня, хотя, кажется, мне придется пройти каждый из них в отдельности. Делает github.com/ajaxorg/cloud9 конкретно , если это имеет значение.
Роберт
4
@Robert: Если есть много, вы можете отредактировать конфигурационный файл напрямую , и сделать поиск и замену: sed -i 's@git://github@https://github@' .git/config.
Каскабель
Хм, почему-то они говорят, что http: // в файле, но команда все еще пытается git: //
Роберт
1
У меня та же проблема, описанная в OP, но когда я использую это решение, оно все равно не работает, но с немного другой ошибкой. Он говорит: «ошибка: при доступе к https: // ... fatal: HTTP-запрос не выполнен» Кто-нибудь знает что-нибудь об этом? Мой Хост что-то блокирует? Мои другие подмодули обновляются нормально, у меня проблемы только с одним.
Джо Спраг
13

Другой вариант, который не затрагивает касание git config, - это изменить настройки ssh для использования порта 443 вместо обычного 22 порта.

Справка: Использование SSH через порт HTTPS

Из этой статьи:

edit the file at ~/.ssh/config, and add this section:

Host github.com
   Hostname ssh.github.com   
   Port 443

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

elpddev
источник
7

У меня тоже была такая же проблема некоторое время. Затем я попытался изменить конфигурацию git, используя предложенную команду:

git config --global url."https://".insteadOf git://

что, к сожалению, не помогло мне . У меня все еще была та же проблема!

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

git remote set-url origin https://github.com/<my_user_name>/<my_repo_name>.git

который ранее был таким:

git remote set-url origin git@github.com:<my_user_name>/<my_repo_name>.git

После установки удаленного URL https://вместо git@git.comменя проблема решилась.

К.М. Ракибул Ислам
источник
1
У меня возникла похожая проблема. Кажется, установка глобальных параметров влияет только на репо, клонированные в будущем, и не изменяется задним числом.
Тейлор Эдмистон
2

Продолжая ответ Натана, вы также можете попробовать протокол ssh, если ваш корпоративный брандмауэр мешает https. В моем случае брандмауэр блокировал протокол git, повторно выдавал ssl-сертификаты для https, и это было для меня бесполезно, даже с отключенной опцией strict-ssl. Вы можете выполнить аналогичную перезапись URL для ssh и создать ключ / пару ssh, как описано на github .

 git config --global url."ssh://git@github.com".insteadOf git://github.com

Вы также должны были бы включить ssh-agent для вашей установки git.

jhiller
источник
1

потому что адрес GIT для сервера узла изменился, вы должны ввести сейчас:

мерзкий клон https://github.com/joyent/node

удачи

Предприятию
источник
6
Этот вопрос был с февраля, когда выше был действительный URL.
Роберт
@calccrypto ссылка является частью команды, которая не помечена кодом, она не предназначена для ссылки на информацию.
Майк Преупап
0

Введение

Я добавлю сюда свой собственный подход ( который не требуется, если у вас есть общедоступный репозиторий git, который поддерживает https ).

Я работаю в компании, где репозиторий git доступен только внутри компании. Но я тоже работаю из дома.

Как я могу отправить в хранилище компании из дома?

Я создал хранилище с папкой на моем диске Google. За исключением git и https, вы можете включать репозитории в качестве путей.

введите описание изображения здесь

Итак, вместо нажатия на источник я нажимаю на «gDrive». Это приводит к синхронизации папки с моей домашней рабочей станции на диске Google, а затем мой рабочий компьютер извлекает изменения. Кроме того, поскольку иногда файлы в каталоге «.git» не синхронизируются, я временно переименовываю папку, например, из «trunk» в «trunk2». Это приводит к 100% синхронизации домашнего и рабочего компьютеров с Google Drive.

Затем я подключаюсь к своему рабочему компьютеру через удаленную контрольную точку vpn (или teamviewer) и помещаю свои обновления в репозиторий work git.

Кроме того, этот процесс будет работать наоборот для отправки в репозиторий git за пределами заблокированной компании.

  1. Нажмите с рабочей станции git repo в папку на диске Google.
  2. Принудительная 100% синхронизация путем временного переименования директории проекта в gDrive.
  3. Получите доступ к домашнему компьютеру через какой-то пульт и нажмите на изменения.
Menios
источник