git clone - thất bại thay vì nhắc nhở về thông tin đăng nhập


13

Khi nhân bản kho git trong các công cụ tự động - kết thúc web, hệ thống CI, đôi khi lời gọi nhân bản git mở ra một dấu nhắc hỏi tên người dùng và mật khẩu (ví dụ: khi sao chép repo Github không tồn tại hoặc trên một nút mới thiếu khóa ssh ).

Làm cách nào để khiến git không thành công (tốt nhất là với thông báo lỗi hợp lý và mã thoát) thay vì chờ quá trình máy chủ cung cấp cho nó tên người dùng và mật khẩu?


Chúng tôi có một Jenkins đa máy chủ được thiết lập, thật khó chịu khi chờ đợi một dấu nhắc cho đến khi bị giết nếu nó chạy trên một máy chủ mới thiếu các khóa ssh - một cách để cấu hình rằng nó sẽ đơn giản thất bại với một thông báo và mã thoát không bằng 0 có ích
Daniel Staple

Nếu một chế độ bắt tất cả "lô" có thể được sử dụng để không cho phép nhắc nhở các khóa máy chủ - điều này sẽ rất lý tưởng.
Daniel Staple

Cả hai đều liên quan - cố gắng ghép chúng lại với nhau - serverfault.com/questions/61915/ ,, stackoverflow.com/questions/7772190/ ,.
Daniel Staple

Câu trả lời:


14

Trong phiên bản git 2.3, có một biến môi trường GIT_TERMINAL_PROMPTmà khi được đặt thành 0sẽ vô hiệu hóa lời nhắc cho thông tin đăng nhập.

Bạn có thể nhận thêm thông tin về nó trong man git(sau khi cập nhật lên phiên bản git 2.3) hoặc trong bài đăng trên blog này trên github .

Ví dụ:

  • git clone https://github.com/some/non-existing-repo sẽ nhắc nhập tên người dùng và mật khẩu
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo sẽ thất bại mà không nhắc tên người dùng và mật khẩu

Thật khó chịu khi được quay lại đây với bản sao git https, trên máy chủ el7 với git 1.8. Đi để kiểm tra nếu cập nhật lên 2.0 từ repo khác là một tùy chọn cho nó.
Daniel Staple

0

Nếu bạn đang sử dụng xác thực ssh và trên linux, thì bạn có thể tạo một lệnh thay thế ssh để vô hiệu hóa điều này.

Tạo một tệp có tên "sshnoprompt.sh" với:

ssh -oBatchMode=yes $@

Làm cho tập tin này thực thi với chmod +x sshnoprompt.sh

Sau đó khi bắt đầu git:

GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo

Và nó sẽ không cho phép bất kỳ lời nhắc hoặc câu hỏi tương tác nào - nó không thể hỏi người dùng bất cứ điều gì.


0

Làm việc từ phiên bản git 1.8.3.1;

git clone -c core.askPass $echo url/or/path/to/git/repo

Cấu hình core.askPasshoạt động bằng cách chuyển quyền kiểm soát xử lý thông tin đăng nhập cho chương trình nói trên. Tuy nhiên, vì $echokhông thể làm bất cứ điều gì ngoại trừ đầu ra, nỗ lực nhân bản nhanh chóng thất bại và áp dụng chuyển hướng bash tương ứng. Mã này chỉ được gọi trong trường hợp kho git xảy ra là riêng tư và sẽ xuất ra lỗi đường ống cho biết xác thực thất bại cho kho lưu trữ cụ thể. Bạn có thể kiểm tra điều này với https://github.com/git/gitkho lưu trữ công khai đối với kho lưu trữ riêng mà bạn biết.

Để làm dịu thỏa thuận, bạn thậm chí sẽ không cần tham khảo một chương trình như echoở nơi đầu tiên. Chỉ cần chuyển cấu hình git -c core.askPasskhông có đầu vào sau sẽ vẫn gây ra lỗi trong trường hợp kho lưu trữ là riêng tư vì mã sẽ không biết chương trình nào giảm tải xử lý thông tin xác thực. Mặc dù đây chắc chắn là một phương pháp cũ hơn và đơn giản hơn các phương pháp khác được đề cập ở đây, tôi không biết liệu nó có có tác dụng tương tự trong các phiên bản cũ hơn của git hay không.


Bạn có phần đúng trong khi rất sai. Trước hết, trong trường hợp của bạn $echolà một tham chiếu biến đổi (không được đặt) mở rộng thành chuỗi rỗng, vì vậy nó hoàn toàn vô nghĩa. Nếu bạn đặt echoở đó (không có ký hiệu đô la), nó cũng sẽ không chính xác vì nó sẽ được hiểu là vị trí kho lưu trữ. Nó phải như vậy -c core.askPass=echo.
Michał Górny

-1

Tùy thuộc vào cách bạn đang chạy git, chuyển hướng stdin hoặc stdout để chúng không được kết nối với thiết bị đầu cuối sẽ ngăn git nhắc nhở để biết chi tiết và chỉ khiến nó bị lỗi.

Điều này cũng sẽ cho phép bạn xuất hiện các lỗi bề mặt (hoặc ít nhất là nhật ký) cho dịch vụ web.


Làm thế nào chính xác tôi sẽ đi về làm điều này? Cố gắng thực hiện điều này trong Bash trước, cả hai </dev/nullnohup .. &dường như không hoạt động.
Tin Tvrtković

Câu trả lời này không hữu ích nếu không có một ví dụ cụ thể làm thế nào để đạt được điều này. Đặc biệt là các phương pháp 'hiển nhiên' không hoạt động, như đã đề cập ở trên.
Michał Górny

@ MichałGórny Tôi đã không thấy câu hỏi của OP vài năm trước, nhưng không có đủ thông tin trong câu hỏi (OS, Toolset) để có thể trả lời câu hỏi đó. Chuyển hướng stdin và stdout. Git đã thay đổi rất nhiều kể từ khi câu hỏi được hỏi (ví dụ trên Windows, nó bật lên các hộp thoại bên ngoài để lấy thông tin xác thực nếu bạn đang kết nối với Azure DevOps) vì vậy bạn nên sử dụng biến môi trường được liệt kê trong câu trả lời hàng đầu
Matthew Steeples
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.