Cách thực sự dài dòng để kiểm tra kết nối Git qua SSH?


109

Khi sử dụng GIT, tôi gặp vấn đề với việc sử dụng GIT qua SSH và vì nó hoạt động tốt cả khi đi làm và ở nhà với một modem khác, rõ ràng là modem nhà tôi đang hoạt động. Tôi không có vấn đề kết nối qua HTTP.

Vì vậy, tôi cho rằng đó là sự cố SSH, nhưng tôi không phải là chuyên gia sử dụng trực tiếp. Có lệnh nào tôi có thể chạy để thiết lập kết nối "kiểm tra" không và cho tôi biết chính xác khi nào và ở đâu xảy ra sự cố?

Khá nhiều tất cả các lệnh "lớn hơn" (chẳng hạn như fetch, clonehoặc pushcó nhiều dữ liệu) từ git(ngay cả khi chạy với -v) chỉ "treo" ở giữa kết nối từ xa mà không có dấu hiệu cho thấy tại sao chúng dừng lại, vì vậy chúng không được sử dụng .

Có cách nào để tôi có thể biết thêm chi tiết về những gì đang xảy ra trong kết nối SSH không?

Câu trả lời:


113

Biến môi trường

Từ phiên bản Git 2.3.0, bạn có thể sử dụng biến môi trường GIT_SSH_COMMANDvà truyền -vđối số dài dòng như thế này:

GIT_SSH_COMMAND="ssh -v" git clone example

Để được thêm dài dòng, hãy làm cho nó -vvv:

GIT_SSH_COMMAND="ssh -vvv" git clone example

Cấu hình Git

Từ phiên bản Git 2.10.0, trong repos của Ubuntu 17.04, bạn có thể lưu cấu hình này trên toàn cầu hoặc trên mỗi repo như trong ví dụ này:

git config core.sshCommand "ssh -vvv"
git pull

Đối với tôi ít nhất, nếu tôi làm điều này: GIT_SSH_COMMAND="ssh -v" git clone exampleTôi có thể gỡ lỗi phiên bản SSH, nó được in sau Cloning intotin nhắn, nhưng không thành công git clone. Sau khi tôi gỡ bỏ GIT_SSH_COMMANDnó hoạt động. Cuối cùng, phục vụ mục đích.
Paulo Oliveira

5
Đối với một lần, điều này sẽ tốt hơn:git -c core.sshCommand="ssh -vvv" pull
Joseph K. Strauss

git config --global core.sshCommand "ssh -vvv" git clone example
Azodium

81

Tôi đã có một vấn đề tương tự. Để gỡ lỗi tôi đã thêm một dòng trong ssh_config. Đây là cách tôi đã thực hiện:

git remote -v

Ở đó bạn sẽ tìm thấy một dòng như thế này:

origin  git@github.com:me/test.git (fetch)
origin  git@github.com:me/test.git (push)

Trong trường hợp này là máy chủ lưu trữ github.com. Bây giờ bạn có thể thêm Host-Entry trong ssh config:

vim ~/.ssh/config

Và thêm:

Host github.com
    LogLevel DEBUG3

Khi sử dụng các thao tác git, bạn sẽ nhận được nhiều thông báo gỡ lỗi ngay bây giờ. Để nhận thông báo gỡ lỗi ít hơn, hãy thử sử dụngDEBUG1

Đối với các phiên bản GIT> = 2.3.0, hãy xem câu trả lời từ @Flimm để có giải pháp thông minh hơn.


14

Đọc qua man git, có một số biến môi trường hữu ích bạn có thể đặt GIT_TRACE_PACKETGIT_TRACE. Ví dụ:

GIT_TRACE_PACKET=true git clone ssh://[...]

Một chút muộn để trò chơi, nhưng hy vọng điều này sẽ giúp ai đó!


1
Điều này hữu ích, nhưng bạn không nhận được bất kỳ tin nhắn nào về các vấn đề kết nối với SSH. Nhưng nếu kết nối SSH hoạt động, đây là cách để gỡ lỗi thêm.
Trendfischer

5

Mỗi man ssh:

 -v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This
         is helpful in debugging connection, authentication, and configuration problems.
         Multiple -v options increase the verbosity.  The maximum is 3.

Vì vậy, hãy thử ssh -v. Nếu điều đó không cho bạn biết những gì bạn cần biết, bạn có thể thêm một hoặc hai vgiây để biết thông tin gỡ lỗi chi tiết hơn nữa. Đối với Github nói riêng, hãy thử ssh -vvvT git@github.com.

Thông thường, theo kinh nghiệm của tôi, một phiên SSH bị treo trong khi thiết lập xảy ra khi máy khách không thể hoàn thành phương thức xác thực đã chọn. Kiểm tra xem khóa riêng của bạn có ở đúng nơi với quyền phù hợp và khớp với khóa chung bạn đã cung cấp cho Github.


Cảm ơn câu trả lời, nhưng tôi có lẽ nên hỏi câu hỏi khác (vì GitHub không cho phép kết nối SSH trực tiếp như vậy). Tôi đã chỉnh sửa bài đăng và tiêu đề, nhưng tốt hơn hết là loại bỏ bài này và tạo một câu hỏi mới thay thế?
IQAndreas

@IQAndreas, GitHub không cho phép các kết nối SSH như thế theo nghĩa là giai đoạn xác thực sẽ được thực hiện và nếu sự cố thực sự xảy ra trong bước SSH, bạn sẽ thấy điều đó theo cách đó. Nếu bạn thấy rằng bạn thậm chí không thể đi xa đến thế, điều gì đó đang xảy ra sẽ ngăn kết nối thậm chí được thực hiện.
tgies

1
Tôi đang được xác thực là tốt, và đôi khi push/ pulltrên repo không có vấn đề. Nhưng thường thì nó chỉ "treo" ở giữa lệnh và sẽ không tiếp tục (đặc biệt là khi tôi chuyển một lượng lớn dữ liệu như lớn clonehoặc push). Không có thông báo lỗi, nó chỉ nằm ở đó và không tiếp tục.
IQAndreas

3

Tôi không thấy cách nào để nói với git (1) lệnh bên ngoài sử dụng cho ssh (1), nhưng như một cách giải quyết, chỉ cần đổi tên / path / thành / ssh thành /path/to/ssh.orig, tạo shell tập lệnh bao bọc / đường dẫn / đến / ssh và thêm vào các cờ -v:

$ sudo mv /usr/bin/ssh /usr/bin/ssh.orig
$ sudo vim /usr/bin/ssh
$ cat /usr/bin/ssh
#!/bin/sh

if [ -x /usr/bin/ssh.orig ]; then
    exec /usr/bin/ssh.orig -v -v -v "${@}"
fi

$ sudo chmod a+x /usr/bin/ssh

Tôi nhận được đầu ra dài dòng khi thực hiện các lệnh git hoạt động trên một vận chuyển ssh. Sau khi gỡ lỗi xong, hãy xóa tập lệnh và khôi phục /path/to/ssh.orig thành / path / to / ssh.


4
Thay vì di chuyển các tập tin vào /usr/bin, hãy xem xét đưa tập lệnh bao bọc vào /usr/local/bin.
muru

2
Ít nhất là trên bản cài đặt Windows lạ của tôi, biến môi trường GIT_SSHcó thể được đặt để trỏ đến tệp nhị phân mà bạn muốn Git sử dụng.
Bộ giải mã

Như đã nói, bạn chắc chắn không muốn sửa đổi tệp ssh gốc, nhưng tôi sẽ có các bảo lưu về cách giải quyết trong / usr / local /. Nó không trong suốt, và nó dễ dàng bị dẫm lên. TỐT HƠN: đặt tập lệnh giải pháp thay thế của bạn vào $ HOME / bin và thêm tập lệnh bin mới đó vào biến $ PATH của người dùng của bạn, trước các phân đoạn PATH khác. Và trước khi làm điều đó, tôi sẽ kiểm tra xem không có giải pháp var ENV nào tốt hơn nữa (câu trả lời này đã cũ).
Scott Prive
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.