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: // protocol และล้มเหลว มีวิธีการเปลี่ยนวิธีการที่คำสั่งนั้นจะทำงานหรืออะไร?


คุณมีการเข้าถึง SSH หรือไม่ หรือแค่ HTTP?
Pablo Santa Cruz

56
ผู้ที่พยายามปิดคำถามคอมไพล์คืออะไร ตามคำถามที่พบบ่อยขอบเขตของ SO รวมถึง "เครื่องมือซอฟต์แวร์ที่ใช้กันทั่วไปโดยโปรแกรมเมอร์" มีคำถามเกี่ยวกับคอมไพล์มากกว่าหกพันคำถาม พวกเขาอยู่ที่นี่
Cascabel

9
คุณสามารถให้ Git ใช้งาน https: // โดยอัตโนมัติเมื่อใดก็ตามที่เห็น git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

คำตอบ:


426

หากนี่เป็นปัญหาของไฟร์วอลล์ที่ปิดกั้นพอร์ต git: โปรโตคอล (9418) คุณควรทำการเปลี่ยนแปลงที่ถาวรมากขึ้นเพื่อที่คุณจะได้ไม่ต้องจดจำคำสั่งที่แนะนำโดยโพสต์อื่น ๆ ของ git repo ทุกตัว

วิธีการแก้ปัญหาด้านล่างนี้ยังใช้งานได้กับ submodules ซึ่งอาจใช้โปรโตคอล 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://การhttps://

คำสั่งนี้เปลี่ยนแปลงอะไรบ้าง?

ดูการกำหนดค่าทั่วโลกของคุณโดยใช้:

git config --list

คุณจะเห็นบรรทัดต่อไปนี้ในผลลัพธ์:

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

คุณสามารถดูว่าไฟล์นี้มีลักษณะอย่างไรโดยดู~/.gitconfigที่ตอนนี้คุณควรเห็นว่ามีการเพิ่มสองบรรทัดต่อไปนี้:

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

ต้องการการควบคุมมากขึ้น?

เพียงใช้ URL ที่สมบูรณ์ / เฉพาะเจาะจงมากขึ้นในการแทนที่ ตัวอย่างเช่นหากต้องการให้ GitHub URL ใช้ https: // แทน git: // คุณสามารถใช้สิ่งต่อไปนี้:

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

คุณสามารถรันคำสั่งนี้หลายครั้งโดยใช้การแทนที่ที่แตกต่างกัน อย่างไรก็ตามในกรณีที่ URL ตรงกับการแทนที่หลายครั้งการจับคู่ที่ยาวที่สุด "ชนะ" จะมีการแทนที่เพียงครั้งเดียวต่อ URL

การเปลี่ยนแปลงทั้งระบบสำหรับ Sysadmins

หากคุณเป็น Linux Sysadmin และคุณไม่ต้องการให้ผู้ใช้ต้องผ่านความเจ็บปวดข้างต้นคุณสามารถทำการเปลี่ยนแปลงการตั้งค่า git ทั่วทั้งระบบได้อย่างรวดเร็ว

เพียงแก้ไขหรือเพิ่มเนื้อหาต่อไปนี้/etc/gitconfigและ voila ผู้ใช้ของคุณไม่ต้องกังวลเกี่ยวกับข้อใด ๆ ข้างต้น:

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

9
ความเรียบง่ายยอดเยี่ยม!
Lance Hunt

ใช้งานได้ดี! ไม่มีการค้นหาและแทนที่ สร้างสคริปต์เพียงแค่ทำงานตอนนี้ คำตอบนี้ช่วยให้ฉันประหยัดเวลาได้มาก ขอบคุณ!
Jeremy Bell

7
สำหรับการควบคุม URL ที่ได้รับการแปลงอีกเล็กน้อยคุณสามารถระบุส่วนของ URL ได้เช่นกัน ตัวอย่างเช่น: ฉันมีเซิร์ฟเวอร์ภายในส่วนตัว 'myserver.lan.example.com' ที่โฮสต์ git repos ผ่าน SSH (gitlab) แต่ไม่ใช่ HTTPS ดังนั้นฉันต้องใช้ SSH ถ้าฉันต้องการใช้ประโยชน์จากการรับรองความถูกต้องของคีย์ที่สะดวก ฉันยังใช้ repos จาก Github แต่ไฟร์วอลล์ขององค์กรของฉันบล็อก SSH ไปที่ Github ฉันไม่ต้องการแทนที่ 'git: //' ทั้งหมดด้วย 'https: //' เพียงเพราะจะทำให้ gitlab แตก git config --global url."https://github".insteadOf git://githubการแก้ปัญหาคือ
clayzermk1

2
ฉันใช้คอมไพล์จากด้านในของ cygwin และวิธีเดียวที่ฉันจะทำให้มันทำงานได้คือ 'การเปลี่ยนแปลงทั้งระบบสำหรับ Sysadmins' และเพิ่ม 'url.https: //.insteadof=git: //' เพื่อ ไฟล์ 'C: \ Program (x86) \ Git \ etc \ gitconfig' ขอบคุณสำหรับคำใบ้!
Craig

3
หากต้องการยกเลิกการเปลี่ยนแปลงนี้สามารถใช้ได้git config --global --unset url."https://".insteadOf
djskinner

29

Github ยังให้การเข้าถึง http ด้วยซึ่ง บริษัท ของคุณอาจถูกบล็อกได้น้อยกว่ามาก เพื่อบอก submodule ให้ใช้คุณสามารถทำได้:

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 repo ทางไกลได้


เสียงแบบนี้อาจใช้ได้กับฉันแม้ว่าฉันจะต้องผ่านแต่ละที กำลังทำgithub.com/ajaxorg/cloud9โดยเฉพาะถ้าเรื่องนั้นสำคัญ
Robert

4
@ Robert: ถ้ามีจำนวนมากคุณสามารถแก้ไขไฟล์ config sed -i 's@git://github@https://github@' .git/configโดยตรงและจะค้นหาและแทนที่:
Cascabel

อืมด้วยเหตุผลบางอย่างที่พวกเขาพูด http: // ในไฟล์ แต่คำสั่งยังคงพยายาม git: //
Robert

1
ฉันมีปัญหาเดียวกันที่อธิบายไว้ใน OP แต่เมื่อฉันใช้วิธีนี้ก็ยังคงล้มเหลว แต่มีข้อผิดพลาดแตกต่างกันเล็กน้อย มีข้อความแจ้งว่า "ข้อผิดพลาด: ขณะเข้าถึง https: // ... ถึงขั้นร้ายแรง: คำขอ HTTP ล้มเหลว" มีใครเข้าใจเรื่องนี้บ้างไหม โฮสต์ของฉันปิดกั้นบางสิ่งหรือไม่ submodules อื่น ๆ ของฉันอัปเดตได้ดีฉันมีปัญหากับหนึ่งเท่านั้น
Jo Sprague

13

ตัวเลือกอื่นที่ไม่เกี่ยวข้องกับการตั้งค่าการสัมผัส git คือการเปลี่ยนการตั้งค่า ssh เพื่อใช้พอร์ต 443 แทนพอร์ต 22 ปกติ

การอ้างอิง: การใช้ SSH ผ่านพอร์ต HTTPS

จากบทความนั้น:

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

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

หลังจากนั้นฉันสามารถใช้ gitub ผลัก Github ได้สำเร็จ ที่บ้านคุณสามารถเปลี่ยนการตั้งค่า ssh กลับเป็นแบบที่คุณต้องการได้


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
ฉันพบปัญหาที่คล้ายกัน ดูเหมือนว่าการตั้งค่าระดับโลกจะส่งผลกระทบต่อ repos ที่ถูกโคลนในอนาคตและจะไม่เปลี่ยนแปลงใด ๆ ย้อนหลัง
Taylor Edmiston

2

เมื่อเพิ่มคำตอบของ Nathan แล้วคุณยังสามารถลองใช้โปรโตคอล ssh ได้หากไฟร์วอลล์ขององค์กรของคุณรบกวน https ในกรณีของฉันไฟร์วอลล์กำลังปิดกั้นโปรโตคอล git ออกใบรับรอง SSL อีกครั้งสำหรับ https และนี่เป็นการทำลายความน่าสะพรึงกลัวสำหรับฉันแม้ว่าจะปิดตัวเลือกเข้มงวด ssl ก็ตาม คุณสามารถทำเขียน URL ที่คล้ายกันสำหรับ SSH และสร้างคีย์ SSH / คู่ตามที่อธิบายไว้ใน GitHub

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

คุณจะต้องเปิด ssh-agentสำหรับการติดตั้ง git ของคุณ


1

เป็นเพราะที่อยู่ GIT สำหรับโหนดเซิร์ฟเวอร์มีการเปลี่ยนแปลงคุณต้องป้อนตอนนี้:

git clone https://github.com/joyent/node

โชคดี


6
คำถามนี้มาจากกุมภาพันธ์เมื่อสิ่งที่กล่าวมาเป็น URL ที่ถูกต้อง
Robert

@calccrypto ลิงก์เป็นส่วนหนึ่งของคำสั่งที่ไม่ได้ติดแท็กรหัส แต่ไม่ได้หมายถึงลิงก์ไปยังข้อมูล
Mike Precup

0

บทนำ

ฉันจะเพิ่มที่นี่เป็นแนวทางของฉันเอง ( ซึ่งไม่จำเป็นถ้าคุณมีที่เก็บ git ที่สาธารณชนเข้าถึงได้ซึ่งรองรับ https )

ฉันทำงานที่ บริษัท ที่มีที่เก็บ git เข้าถึงได้จากภายใน บริษัท เท่านั้น แต่ฉันก็ทำงานจากที่บ้าน

ฉันจะผลักดันไปยังที่เก็บข้อมูล บริษัท จากที่บ้านได้อย่างไร

ฉันสร้างที่เก็บพร้อมโฟลเดอร์ในไดรฟ์ google ของฉันแล้ว ยกเว้น git และ https คุณสามารถรวมที่เก็บเป็นพา ธ

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นแทนที่จะผลักไปที่ต้นกำเนิดฉันดันไปที่ "gDrive" สิ่งนี้ทำให้โฟลเดอร์ซิงค์จากเวิร์กสเตชันในบ้านของฉันกับไดรฟ์ google จากนั้นคอมพิวเตอร์ทำงานของฉันจะดึงการเปลี่ยนแปลง นอกจากนี้เนื่องจากบางครั้งไฟล์ในไดเรกทอรี ".git" ไม่ได้ซิงค์ฉันจึงเปลี่ยนชื่อโฟลเดอร์ชั่วคราวเช่น "trunk" เป็น "trunk2" สิ่งนี้ทำให้ทั้งคอมพิวเตอร์ที่บ้านและที่ทำงานต้องซิงค์กับ google ไดรฟ์ 100%

จากนั้นฉันก็ล็อกออนคอมพิวเตอร์ที่ทำงานของฉันผ่าน checkpoint-vpn remote (หรือ teamviewer) และผลักดันการอัปเดตของฉันไปยังที่เก็บ git ที่ทำงาน

นอกจากนี้กระบวนการจะทำงานในทางกลับกันสำหรับการผลักดันไปยังที่เก็บ git นอก บริษัท ที่ถูกบล็อก

  1. ผลักดันจากเวิร์กสเตชันคอมไพล์ repo ไปยังโฟลเดอร์ใน Google ไดรฟ์
  2. บังคับให้ซิงค์ 100% โดยเปลี่ยนชื่อไดเรกทอรีโครงการชั่วคราวใน gDrive
  3. เข้าถึงคอมพิวเตอร์ที่บ้านผ่านรีโมทและผลักดันการเปลี่ยนแปลงบางประเภท
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.