git: // giao thức bị chặn bởi công ty, làm thế nào tôi có thể khắc phục điều đó?


188

Cố gắng một cái gì đó như git clone git://github.com/ry/node.gitsẽ không hoạt động, kết quả là:

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)

Tuy nhiên, nhân bản qua HTTP hoạt động tốt. Cho đến nay tôi đã tập hợp rằng đó là một vấn đề với giao thức, nhưng tôi đang cố gắng cài đặt cloud9 đang yêu cầu lệnh

git submodule update --init --recursive

đang cố gắng sử dụng giao thức git: // và bị lỗi. Có cách nào để thay đổi cách lệnh đó sẽ hoạt động hoặc một cái gì đó?


bạn có quyền truy cập SSH không? hay chỉ là HTTP?
Pablo Santa Cruz

56
Nó là gì với những người đang cố gắng để đóng câu hỏi git? Theo FAQ, phạm vi của SO bao gồm "các công cụ phần mềm thường được lập trình viên sử dụng". Có hơn sáu ngàn câu hỏi git ở đây. Họ thuộc về nơi này.
Cascabel

9
Bạn có thể nhận Git để tự động sử dụng https: // bất cứ khi nào thấy git: // URL:git config --global url.https://.insteadOf git://
WildlyInacc chính xác

Câu trả lời:


426

Nếu đây là sự cố với tường lửa của bạn chặn cổng git: Protocol (9418), thì bạn nên thực hiện một thay đổi liên tục hơn để bạn không phải nhớ đưa ra các lệnh được đề xuất bởi các bài đăng khác cho mỗi repo git.

Giải pháp dưới đây cũng chỉ hoạt động đối với các mô hình con cũng có thể sử dụng giao thức git :.

Vì thông báo git không thực sự trỏ ngay đến cổng chặn tường lửa 9418, hãy thử chẩn đoán đây là sự cố thực tế.

Chẩn đoán vấn đề

Tài liệu tham khảo: https://superuser.com/q/621870/203918https://unix.stackexchange.com/q/11756/57414

Có một số công cụ chúng tôi có thể sử dụng để xác định xem tường lửa có gây ra sự cố hay không - sử dụng bất kỳ công cụ nào được cài đặt trên hệ thống của bạn.

# 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

OK, vậy bây giờ chúng tôi đã xác định đó là cổng git của chúng tôi bị chặn bởi tường lửa, chúng tôi có thể làm gì về nó? Đọc tiếp :)

Viết lại URL cơ bản

Git cung cấp một cách để viết lại URL bằng cách sử dụng git config. Đơn giản chỉ cần ban hành lệnh sau:

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

Bây giờ, như thể bằng phép thuật, tất cả các lệnh git sẽ thực hiện thay thế git://chohttps://

Lệnh này đã tạo ra những thay đổi gì?

Hãy xem cấu hình toàn cầu của bạn bằng cách sử dụng:

git config --list

Bạn sẽ thấy dòng sau trong đầu ra:

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

Bạn có thể thấy nó trông như thế nào trên tập tin, bằng cách xem qua ~/.gitconfignơi bạn sẽ thấy rằng hai dòng sau đã được thêm vào:

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

Muốn kiểm soát nhiều hơn?

Chỉ cần sử dụng một URL đầy đủ / cụ thể hơn trong thay thế. Ví dụ: để chỉ có các URL GitHub sử dụng https: // thay vì git: //, bạn có thể sử dụng một cái gì đó như:

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

Bạn có thể chạy lệnh này nhiều lần bằng các thay thế khác nhau. Tuy nhiên, trong trường hợp URL khớp với nhiều lần thay thế, trận đấu dài nhất sẽ "thắng". Chỉ một thay thế duy nhất sẽ được thực hiện cho mỗi URL.

Thay đổi toàn hệ thống cho Sysadmin

Nếu bạn là Linux Sysadmin và bạn không muốn người dùng của mình phải trải qua những khó khăn nêu trên, bạn có thể thực hiện thay đổi cấu hình git toàn hệ thống nhanh chóng.

Chỉ cần chỉnh sửa hoặc thêm các nội dung sau vào /etc/gitconfigvà voila, người dùng của bạn không phải lo lắng về bất kỳ điều nào ở trên:

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

9
Rực rỡ đơn giản!
Lance Hunt

Hoạt động tuyệt vời! Không còn tìm kiếm và thay thế. Xây dựng các kịch bản chỉ hoạt động bây giờ. Câu trả lời này đã tiết kiệm cho tôi rất nhiều thời gian. Cảm ơn!
Jeremy Bell

7
Để kiểm soát nhiều hơn một chút về URL nào được chuyển đổi, bạn cũng có thể chỉ định một phần của URL. Ví dụ: Tôi có một máy chủ nội bộ riêng 'myserver.lan.example.com' lưu trữ git repos qua SSH (gitlab) nhưng không phải HTTPS. Do đó, tôi phải sử dụng SSH nếu tôi muốn tận dụng xác thực khóa thuận tiện. Tôi cũng sử dụng repos từ Github, nhưng tường lửa công ty của tôi chặn SSH sang Github. Tôi không muốn đơn giản thay thế tất cả các trường hợp của 'git: //' bằng 'https: //' vì điều đó sẽ phá vỡ gitlab. Giải pháp là git config --global url."https://github".insteadOf git://github.
clayzermk1

2
Tôi đã chạy git từ bên trong cygwin và cách duy nhất tôi có thể làm việc này là thực hiện 'Thay đổi toàn hệ thống cho Sysadmins' và thêm 'url.https: //.insteadof=git: //' thay đổi tệp 'C: \ Chương trình (x86) \ Git \ etc \ gitconfig'. Cảm ơn các gợi ý!
Craig

3
Để hoàn tác thay đổi này, người ta có thể sử dụnggit config --global --unset url."https://".insteadOf
djskinner

29

Github cũng cung cấp quyền truy cập http (s), điều này ít có khả năng bị chặn bởi công ty của bạn. Để nói với mô hình con sử dụng điều đó, bạn có thể làm điều này:

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

Đây thực sự là chính xác lý do tại sao init và update là các lệnh riêng biệt - bạn có thể init, tùy chỉnh vị trí, sau đó cập nhật. update --initchỉ là lối tắt khi bạn không cần tùy chỉnh bất kỳ URL nào.

Đối với bất kỳ ai khác xảy ra vấn đề này, tất nhiên bạn cũng có thể sử dụng URL ssh (nếu công ty của bạn chặn git: // nhưng không phải ssh), nhưng trong trường hợp này, OP có lẽ không có quyền truy cập SSH vào repo từ xa.


Âm thanh như thế này có thể sẽ làm việc cho tôi, mặc dù có vẻ như tôi sẽ phải đi qua từng người một. Đã làm github.com/ajaxorg/cloud9 nếu điều đó quan trọng.
Robert

4
@Robert: Nếu có nhiều, bạn có thể chỉnh sửa tệp cấu hình trực tiếp và thực hiện tìm kiếm và thay thế : sed -i 's@git://github@https://github@' .git/config.
Cascabel

Hmm, vì một số lý do họ nói http: // trong tệp, nhưng lệnh vẫn thử git: //
Robert

1
Tôi có cùng một vấn đề được mô tả trong OP, nhưng khi tôi sử dụng giải pháp này, nó vẫn thất bại, nhưng với một lỗi hơi khác. Nó báo "lỗi: trong khi truy cập https: // ... gây tử vong: Yêu cầu HTTP không thành công" Có ai có bất kỳ cái nhìn sâu sắc nào về điều này không? Là máy chủ của tôi đang chặn một cái gì đó? Các mô hình con khác của tôi cập nhật tốt, tôi chỉ gặp rắc rối với một.
Jo Sprague

13

Một tùy chọn khác không liên quan đến việc chạm vào cấu hình git là thay đổi cài đặt ssh để sử dụng cổng 443 thay vì cổng 22 thông thường.

Tham khảo: Sử dụng SSH qua cổng HTTPS

Từ bài báo đó:

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

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

Sau đó, tôi đã có thể git đẩy thành công Github. Ở nhà, bạn có thể thay đổi cấu hình ssh trở lại như cũ nếu bạn muốn.


7

Tôi cũng gặp vấn đề tương tự trong một thời gian. Sau đó, tôi đã thử thay đổi cấu hình git bằng lệnh được đề xuất:

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

Thật không may, đã không làm điều đó cho tôi . Tôi vẫn gặp vấn đề tương tự!

Điều cuối cùng thực sự giải quyết vấn đề của tôi là, tôi đã thiết lập lại url từ xa của kho lưu trữ của mình bằng lệnh sau:

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

mà trước đây là như thế này:

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

Sau khi thiết lập url từ xa bằng cách sử dụng https://thay vì git@git.comvấn đề đã được giải quyết cho tôi.


1
Tôi đã trải qua một vấn đề tương tự. Có vẻ như thiết lập toàn cầu chỉ ảnh hưởng đến các bản sao được nhân bản trong tương lai và không thay đổi bất kỳ hồi tố nào.
Taylor Edmiston

2

Mở rộng câu trả lời của Nathan ở trên, bạn cũng có thể thử giao thức ssh nếu tường lửa công ty của bạn can thiệp vào https. Trong trường hợp của tôi, tường lửa đã chặn giao thức git, cấp lại chứng chỉ ssl cho https và điều này đã phá vỡ bower cho tôi, ngay cả khi tùy chọn ssl nghiêm ngặt bị tắt. Bạn có thể thực hiện viết lại url tương tự cho ssh và tạo khóa / cặp ssh như được mô tả trên github .

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

Bạn cũng sẽ phải bật ssh-agent cho cài đặt git của bạn.


1

đó là vì địa chỉ GIT cho máy chủ nút đã thay đổi, bạn phải nhập ngay bây giờ:

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

chúc may mắn


6
Câu hỏi này là từ tháng Hai, khi ở trên là URL hợp lệ.
Robert

@calccrypto liên kết là một phần của lệnh không được gắn thẻ, nó không có nghĩa là một liên kết đến thông tin.
Mike Precup

0

Giới thiệu

Tôi sẽ thêm vào đây cách tiếp cận của riêng tôi ( không bắt buộc nếu bạn có kho git truy cập công khai hỗ trợ https ).

Tôi làm việc tại một công ty nơi kho git chỉ có thể truy cập từ bên trong công ty. Nhưng tôi cũng làm việc ở nhà.

Làm thế nào để tôi đẩy vào kho công ty từ nhà?

Tôi đã tạo một kho lưu trữ với một thư mục trên ổ đĩa google của tôi. Ngoại trừ git và https, bạn có thể bao gồm các kho lưu trữ dưới dạng đường dẫn.

nhập mô tả hình ảnh ở đây

Vì vậy, thay vì đẩy về nguồn gốc, tôi đẩy sang "gDrive". Điều này khiến thư mục đồng bộ từ máy trạm tại nhà của tôi sang ổ đĩa google và sau đó máy tính làm việc của tôi sẽ thay đổi. Ngoài ra, vì đôi khi các tệp trong thư mục ".git" không đồng bộ hóa, tôi tạm thời đổi tên thư mục từ "trunk" thành "trunk2". Điều này buộc cả máy tính gia đình và công việc phải được đồng bộ hóa 100% với ổ đĩa google.

Sau đó, tôi đăng nhập vào máy tính làm việc của mình thông qua điều khiển từ xa checkpoint-vpn (hoặc teamviewer) và đẩy các bản cập nhật của tôi đến kho lưu trữ git công việc.

Ngoài ra, quy trình sẽ hoạt động ngược lại để đẩy vào kho git bên ngoài công ty bị chặn.

  1. Đẩy từ máy trạm git repo vào thư mục trong ổ đĩa google.
  2. Buộc đồng bộ 100% bằng cách tạm thời đổi tên thư mục dự án trong gDrive.
  3. Truy cập máy tính ở nhà thông qua một số loại thay đổi từ xa và đẩy.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.