Làm thế nào để nói với git mà sử dụng khóa riêng?


646

ssh-itùy chọn cho biết tập tin khóa riêng nào sẽ được sử dụng khi xác thực:

-i identity_file

    Chọn một tệp mà từ đó nhận dạng (khóa riêng) cho xác thực RSA hoặc DSA được đọc. Mặc định là ~/.ssh/identitydành cho phiên bản giao thức 1 ~/.ssh/id_rsa~/.ssh/id_dsacho phiên bản giao thức 2. Các tệp nhận dạng cũng có thể được chỉ định trên cơ sở từng máy chủ trong tệp cấu hình. Có thể có nhiều -itùy chọn (và nhiều danh tính được chỉ định trong tệp cấu hình).

Có cách nào tương tự để cho biết gittập tin khóa riêng nào được sử dụng trên một hệ thống có nhiều khóa riêng trong ~/.sshthư mục không?



2
Cũng có liên quan đến serverfault.com/questions/194567/
Mạnh

Câu trả lời:


671

Trong ~/.ssh/config, thêm:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

Bây giờ bạn có thể làm git clone git@github.com:username/repo.git.

LƯU Ý: Xác minh rằng các quyền trên IdentityFile là 400. SSH sẽ từ chối, theo cách không rõ ràng, các khóa SSH quá dễ đọc. Nó sẽ trông giống như một từ chối thông tin. Giải pháp, trong trường hợp này là:

chmod 400 ~/.ssh/id_rsa_github

117
Nếu bạn cần kết nối với cùng một máy chủ với các phím khác nhau thì sao?
Valentin Klinghammer

6
@Quelltextfabrik - bạn có thể thêm một phần khác với Máy chủ khác: nerderati.com/2011/03/ Kẻ
Ben Challenor

1
@Cliff Nop, trong trang của tôi: " HostName: Chỉ định tên máy chủ thực để đăng nhập. Điều này có thể được sử dụng để chỉ định biệt danh hoặc chữ viết tắt cho máy chủ." Phiên bản ssh của tôi là openssh-6.7p1.
Grissiom

11
Nếu tệp cấu hình là mới, đừng quên làmchmod 600 ~/.ssh/config
elysch 15/03/2016

2
@ValentinKlinghammer câu trả lời từ @Flimm có giải pháp cho câu hỏi này. Đó là sử dụng core.sshCommandcấu hình git. superuser.com/a/912281/162466
VasyaNovikov

345

Biến môi trường GIT_SSH_COMMAND:

Từ phiên bản Git 2.3.0, bạn có thể sử dụng biến môi trường GIT_SSH_COMMANDnhư thế này:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Lưu ý rằng -iđôi khi có thể bị ghi đè bởi tệp cấu hình của bạn, trong trường hợp đó, bạn nên cung cấp cho SSH một tệp cấu hình trống, như sau:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Cấu hình core.sshCommand:

Từ Git phiên bản 2.10.0, bạn có thể định cấu hình này cho mỗi repo hoặc toàn cầu, do đó bạn không phải đặt biến môi trường nữa!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

1
Tôi đã phải xuất vỏ biến để một biến môi trường để thực hiện công việc này, ví dụ export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", sau đógit clone example
Abdull

7
@Abdull Trong Bash, thực hiện gán trên cùng một dòng với lệnh xuất biến môi trường cho lệnh đó. Hãy thử nó : example=hello /usr/bin/env | grep example.
Flimm

3
mọi thứ trở nên tốt hơn: kể từ Git 2.10, bạn có thể lưu lệnh trong cấu hình Git của mình: stackoverflow.com/a/38474220/520162
eckes

2
@Noitidart /dev/nullchỉ là một tên tệp hợp lệ trong các hệ điều hành giống như UNIX, nó không hoạt động trên Windows.
Flimm

2
Đối với tôi GIT_SSH_COMMANDđã không làm việc cho đến khi tôi sử dụng IdentitiesOnly, chẳng hạn như lệnh này : GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push.
Tyler Collier

111

Không có cách trực tiếp nào để biết gitkhóa riêng nào được sử dụng, bởi vì nó phụ thuộc vào sshxác thực kho lưu trữ. Tuy nhiên, vẫn còn một vài cách để đạt được mục tiêu của bạn:

Lựa chọn 1: ssh-agent

Bạn có thể sử dụng ssh-agentđể tạm thời ủy quyền khóa riêng của bạn.

Ví dụ:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Tùy chọn 2: GIT_SSH_COMMAND

GIT_SSH_COMMANDTruyền các đối số ssh bằng cách sử dụng biến môi trường (Git 2.3.0+).

Ví dụ:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Bạn có thể nhập tất cả trên một dòng - bỏ qua $và bỏ qua \.

Tùy chọn 3: GIT_SSH

Truyền các đối số ssh bằng cách sử dụng GIT_SSHbiến môi trường để xác định sshnhị phân thay thế .

Ví dụ:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Lưu ý: Các dòng trên là dòng lệnh shell (terminal) mà bạn nên dán vào terminal của mình. Họ sẽ tạo một tệp có tên ssh, làm cho nó có thể thực thi được và (gián tiếp) thực thi nó.

Lưu ý: GIT_SSHcó sẵn từ v0.99.4 (2005).

Tùy chọn 4: ~/.ssh/config

Sử dụng ~/.ssh/configtệp như được đề xuất trong các câu trả lời khác để chỉ định vị trí của khóa riêng của bạn, ví dụ:

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

1
//, Điều gì sẽ xảy ra nếu danh tính của bạn trong ssh-agent được chuyển tiếp, tuy nhiên, như trong câu hỏi này? superuser.com/questions/971732/
trộm

1
Tôi đã cho phép tôi định dạng lại bài đăng này: IMO đây là câu trả lời toàn diện nhất. Trong thiết kế ban đầu của nó, một bản quét nhanh đã gợi ý bài đăng mô tả một giải pháp phức tạp duy nhất cho vấn đề, vì vậy tôi đã bỏ lỡ nó.
Alberto

3
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'làm việc cho tôi khi không có gì khác Thanh danh.
Daniel Dewhurst

1
Tôi đã phải sử dụng ~/.ssh/configphương pháp, env vars không hoạt động với tôi ...
Greg Dubicki

1
GIT_SSHcó sẵn từ v0.99.4 (tháng 8 năm 2005) , vì vậy về cơ bản kể từ khi Git tồn tại (tháng 4 năm 2005).
Dominik

32

Viết một tập lệnh gọi sshvới các đối số bạn muốn và đặt tên tệp của tập lệnh vào $GIT_SSH. Hoặc chỉ cần đặt cấu hình của bạn vào ~/.ssh/config.


2
Một lời giải thích khác về cách làm điều này.
Sithsu

1
~/.ssh/confignhững con đường để đi.
hek2mgl

Tôi làm việc trên một máy (A) mà từ đó tôi git đẩy đến một máy chủ (B) chỉ chấp nhận xác thực khóa ssh. Mặc dù thiết lập ~ / .ssh / config của tôi trên (A) hoạt động hoàn toàn tốt khi tôi làm việc trực tiếp trên máy đó, nhưng nó không hoạt động khi tôi đăng nhập từ một số vị trí khác (C). Sử dụng $GIT_SSHvà một kịch bản đã giải quyết vấn đề này. Cảm ơn!
bsumirak

18

Nếu bạn không muốn phải chỉ định các biến môi trường mỗi khi chạy git, không muốn một tập lệnh bao bọc khác, không / không thể chạy ssh-agent (1), cũng không muốn tải xuống gói khác chỉ cho việc này, hãy sử dụng git -remote-ext (1) vận chuyển bên ngoài:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Tôi coi giải pháp này là ưu việt vì:

  • Nó là kho lưu trữ / từ xa cụ thể
  • Tránh kịch bản lệnh bọc
  • Không cần tác nhân SSH - hữu ích nếu bạn muốn nhân bản / đẩy / kéo không giám sát (ví dụ: trong cron)
  • Chắc chắn, không cần công cụ bên ngoài

2
Câu trả lời này chính xác là những gì tôi cần để buộc gittài nguyên của Chef sử dụng các khóa triển khai dành riêng cho kho lưu trữ để sao chép / tìm nạp từ kho lưu trữ Github riêng tư. Ưu điểm bổ sung của phương thức này so với môi trường / tập lệnh dựa trên môi trường là vì đường dẫn khóa được mã hóa trong cấu hình của repo làm việc, nên nó sẽ sử dụng cùng một khóa trên cả bản sao ban đầu và các lần tải / đẩy tiếp theo.
Adam Franco

2
Ôi! Điều này thật tuyệt, không biết về điều này. Cảm ơn câu trả lời, khá hữu ích trong môi trường bù nhìn, để ngăn chặn những rắc rối thêm để quản lý, .ssh/configvv +1!
gf_

1
Giải pháp này không hoạt động cùng với cờ --recursive. Các mô hình con không được tìm nạp bằng khóa được chỉ định và do đó không thành công nếu chúng yêu cầu auth.
Daniele Testa

1
Mỗi mô hình con là một kho lưu trữ hoàn toàn khác nhau, với bộ điều khiển từ xa riêng. Chúng được dán bởi Git để thuận tiện cho bạn, nhưng không có cách nào điều khiển từ xa cho một mô hình con được gắn với những cái trong kho lưu trữ mẹ. Tôi sợ rằng bạn phải đặt điều khiển từ xa bằng cách sử dụng extphương tiện vận chuyển trong mỗi mô hình con để đệ quy trong cha mẹ hoạt động.
flaviovs

2
Nếu bạn gặp phải lỗi sau fatal: transport 'ext' not allowed, bạn phải lập danh sách trắng giao thức ext thông qua export GIT_ALLOW_PROTOCOL=ext. Về cơ bản, trình trợ giúp từ xa git-remote-ext (hỗ trợ URL "ext :: ssh example.com% S foo / repo") cho phép thực thi lệnh tùy ý. Điều này thường không bao giờ là mối quan tâm vì người dùng luôn nhìn thấy và tin tưởng URL họ chuyển đến git. Tuy nhiên, các mô đun con git, thông qua tệp .gitmodules, cho phép kẻ tấn công yêu cầu khách hàng tìm nạp các URL git tùy ý. hackerone.com/reports/104465
Gomino

18

Sử dụng cấu hình máy chủ tùy chỉnh trong ~/.ssh/config, như thế này:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

sau đó sử dụng tên máy chủ tùy chỉnh của bạn như thế này:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

2
Đây là câu trả lời tôi đang tìm kiếm, vì tôi có tài khoản GitHub riêng cho gia đình và cơ quan. Tôi chỉ phải thiết lập Host work.github.com HostName github.com IdentityFile ~/.ssh/workvà sau đó thay thế "github.com" bằng "work.github.com" bất cứ khi nào tôi sao chép kho lưu trữ công việc. Nó vẫn kết nối với "github.com", nhưng sử dụng cặp khóa không mặc định.
Mikkel

1
URL để biết chi tiết (" itblog.study.land / ..." ) không hoạt động nữa :(
Carl Smotricz

@CarlSmotricz bản gốc đã được chuyển đến đây: Medium.com/@thucnc/ Kẻ
thucnguyen 27/11/18

4
CUỐI CÙNG !!! Câu trả lời này thực sự cho thấy cách bạn có thể sử dụng những gì bạn đặt trong ~/.ssh/configtệp. Mọi câu trả lời khác đều bỏ lỡ cách bạn có thể đặt máy chủ khi bạn thêm nguồn gốc, tự động cho phép git sử dụng tệp khóa chính xác. CẢM ƠN BẠN!!
BrianVPS

1
Thật tuyệt, đó là những gì tôi đang tìm kiếm :)
Lucas D'Avila

15

Sau cuộc đấu tranh của tôi với $GIT_SSHtôi muốn chia sẻ những gì làm việc cho tôi.

Thông qua các ví dụ của tôi, tôi sẽ cho rằng bạn có khóa riêng của mình ở/home/user/.ssh/jenkins

Lỗi cần tránh: Giá trị GIT_SSH bao gồm các tùy chọn

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

hoặc bất cứ điều gì tương tự sẽ thất bại, vì git sẽ cố gắng thực hiện giá trị dưới dạng tệp . Vì lý do đó, bạn phải tạo một kịch bản.

Ví dụ hoạt động của tập lệnh $ GIT_SSH /home/user/gssh.sh

Kịch bản sẽ được gọi như sau:

$ $GIT_SSH [username@]host [-p <port>] <command>

Kịch bản mẫu làm việc có thể trông giống như:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Lưu ý $*ở cuối, nó là một phần quan trọng của nó.

Thậm chí thay thế an toàn hơn, sẽ ngăn chặn mọi xung đột có thể xảy ra với bất kỳ thứ gì trong tệp cấu hình mặc định của bạn (cộng với việc đề cập rõ ràng đến cổng để sử dụng) sẽ là:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Giả sử tập lệnh nằm trong /home/user/gssh.sh, bạn sẽ:

$ export GIT_SSH=/home/user/gssh.sh

và tất cả sẽ làm việc


Cảm ơn. Chỉ cần lưu ý: sử dụng "$ @" thay vì $ * cho các đối số truyền qua, vì trước đây hành xử đúng khi các đối số chứa khoảng trắng.
Piotr Findeisen

@PiotrFindeisen Cảm ơn bạn đã lưu ý. Tuy nhiên, tôi không hiểu nó hoàn toàn - trong zsh, nó giúp tôi giữ các chuỗi có khoảng trống trong một mảnh, nhưng trong bash thì không. Bạn có thể cho tôi biết thêm hoặc chỉ ra một số lời giải thích? Tôi không muốn thêm một số sửa đổi một cách mù quáng.
Jan Vlcinsky

Bạn nên loại bỏ nửa đầu câu trả lời của bạn. Không ai quan tâm đến một giải pháp không hiệu quả, và thật lãng phí khi đọc mà làm xáo trộn câu trả lời đúng ở phía dưới, hoạt động tuyệt vời.
Cerin

@Cerin Nếu bạn muốn loại bỏ "Lỗi cần tránh" thì tôi sẽ giữ nó ở đó. Nó chia sẻ cạm bẫy chung để tránh và nó rất ngắn. Tôi chắc chắn, ai đó sẽ cố gắng tối ưu hóa giải pháp bằng cách cung cấp tất cả mọi thứ thành biến (điều này xảy ra với tôi), vì vậy tôi đã cố gắng rút ngắn con đường dẫn đến thành công.
Jan Vlcinsky

5

Bạn chỉ có thể sử dụng ssh-nhận dạng thay vì tạo trình bao bọc của riêng bạn.

Bạn có thể đọc thêm tại: https://github.com/ccontavalli/ssh-ident

Nó tải các khóa ssh theo yêu cầu khi cần lần đầu tiên, một lần, thậm chí với nhiều phiên đăng nhập, xterms hoặc nhà chia sẻ NFS.

Với một tệp cấu hình nhỏ, nó có thể tự động tải các khóa khác nhau và giữ chúng tách biệt trong các tác nhân khác nhau (để chuyển tiếp tác nhân) tùy thuộc vào những gì bạn cần làm.


5

Tôi đã có một khách hàng cần một tài khoản github riêng. Vì vậy, tôi cần sử dụng một khóa riêng cho dự án này.

Giải pháp của tôi là thêm phần này vào .zshrc / .bashrc:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

Bất cứ khi nào tôi muốn sử dụng git cho dự án đó, tôi thay thế "infogit" bằng git:

infogit commit -am "Some message" && infogit push

Đối với tôi, nó dễ nhớ hơn.


4

Vì vậy, tôi đặt biến env GIT_SSH thành $HOME/bin/git-ssh.

Để hỗ trợ cấu hình repo của tôi ra lệnh sử dụng danh tính ssh nào, ~/bin/git-sshtệp của tôi là:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

Sau đó, tôi có một cài đặt cấu hình git toàn cầu:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

Và trong bất kỳ kho git nào, tôi chỉ có thể đặt ssh.identitygiá trị cấu hình git cục bộ :

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Voila!

Nếu bạn có thể có một địa chỉ email khác nhau cho mỗi sắc, nó được thậm chí đơn giản hơn, bởi vì bạn chỉ có thể đặt tên cho phím của bạn sau khi địa chỉ email của bạn và sau đó có user.email các git config của lái xe lựa chọn quan trọng trong một ~/bin/git-sshnhư thế này:

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*

2

Giải pháp của tôi là thế này:

tạo một kịch bản:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
   case $i in
    --port=*)
        PORT="${i:7}";;
    --key=*)KEY="${i:6}";;
   esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

sau đó khi bạn phải thay đổi chạy var:

. ./thescript.sh [--port=] [--key=]

Đừng quên dấu chấm thêm !! Điều này làm cho tập lệnh thiết lập các vars môi trường !! --key và --port là tùy chọn.


2

Nói chung, bạn muốn sử dụng ~/.ssh/configcho việc này. Chỉ cần ghép địa chỉ máy chủ với các khóa bạn muốn sử dụng cho chúng như sau:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *biểu thị bất kỳ máy chủ nào, vì vậy tôi sử dụng nó để đặt ~/.ssh/id_rsalàm khóa mặc định sử dụng.


2

Tôi xây dựng trên @shellholic và chủ đề SO này với một vài tếch. Tôi sử dụng GitHub làm ví dụ và giả sử rằng bạn có khóa riêng trong ~/.ssh/github(nếu không, hãy xem chủ đề SO này ) và bạn đã thêm khóa chung vào hồ sơ GitHub của mình (nếu không hãy xem trợ giúp của GitHub ).

Nếu cần, hãy tạo tệp cấu hình SSH mới tại ~/.ssh/configvà thay đổi quyền thành 400

touch ~/.ssh/config
chmod 600 ~/.ssh/config

Thêm phần này vào ~/.ssh/configtập tin:

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

Nếu bạn đã có một thiết lập từ xa, bạn có thể muốn xóa nó, nếu không bạn vẫn có thể được nhắc nhập tên người dùng và mật khẩu:

git remote rm origin

Sau đó thêm một điều khiển từ xa vào kho git và chú ý dấu hai chấm trước tên người dùng:

git remote add origin git@github.com:user_name/repo_name.git

Và sau đó các lệnh git hoạt động bình thường, ví dụ:

git push origin master
git pull origin 

@HeyWatchĐiều này trên luồng SO này đã đề xuất thêm IdentitiesOnly yesđể ngăn hành vi mặc định của SSH gửi tệp nhận dạng khớp với tên tệp mặc định cho mỗi giao thức. Xem chủ đề đó để biết thêm thông tin và tài liệu tham khảo.


Đây là lỗi của tôi: "Nếu bạn đã có một thiết lập từ xa ...". Cảm ơn rất nhiều!!!
Allan Andrade

lỗi phổ biến --- đây là câu trả lời
Goddard

1

Chỉ cần sử dụng ssh-agentssh-addra lệnh.

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

Sau khi thực hiện các lệnh trên, bạn có thể sử dụng cả hai khóa cùng một lúc. Chỉ loại

git clone git@github.com:<yourname>/<your-repo>.git

để sao chép kho lưu trữ của bạn.

Bạn cần thực hiện lệnh trên sau khi khởi động lại máy.


Vui lòng giải thích quy trình bao gồm Làm thế nào tôi có thể tạo một đại lý
Srikrushna

0

Tôi đang sử dụng git phiên bản 2.16 và tôi không cần một đoạn script thậm chí không phải là một lệnh cấu hình hoặc sửa đổi.

  • Chỉ cần sao chép khóa riêng của tôi vào .ssh / id_rsa
  • đặt quyền thành 600

Và git đọc tự động. Tôi không hỏi bất cứ điều gì và nó không ném lỗi. Chỉ cần hoạt động tốt.


Bạn có để ý rằng câu hỏi là về một hệ thống có nhiều khóa riêng trong ~/.sshthư mục không?
Scott

0

Trong khi câu hỏi không yêu cầu nó, tôi bao gồm câu trả lời này cho bất kỳ ai khác đang tìm cách giải quyết vấn đề tương tự chỉ dành riêng cho .

Giải pháp gitlab

Tôi đã thử sử dụng phương pháp , nhưng ngay cả tài liệu git cũng khuyên bạn nên sử dụng ~/.ssh/configcho bất cứ điều gì hơn là trường hợp đơn giản. Trong trường hợp của tôi, tôi đang chuyển sang một máy chủ - và tôi muốn làm như vậy với tư cách là một người dùng cụ thể - tất nhiên được xác định bởi khóa trong khi chứ không phải tên người dùng git. Sau khi thực hiện, tôi chỉ cần thực hiện như sau:

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

Thiết lập

Nhớ lại vị trí của của bạn /myfolder/.ssh/my_gitlab_id_rsatrong trường hợp của tôi.

Thêm một mục trong ~/.ssh/config:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

Thêm trong ~/.gitconfig:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

Như một phần thưởng, tôi thực hiện các cam kết của mình trên cùng một máy chủ với tư cách là một người dùng cụ thể với này :

mycommit = "!f() { \
             git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
           }; f"

Giải trình

Tất cả các giả định ở trên giả định điều khiển từ xa có liên quan originvà chi nhánh liên quan hiện đang được kiểm tra. Để tham khảo tôi đã chạy vào một số mục cần được giải quyết:

  • Giải pháp yêu cầu tạo một điều khiển từ xa mới gitlab_as_mevà tôi không muốn nhìn thấy điều khiển từ xa treo xung quanh trong cây log của mình nên tôi gỡ bỏ nó khi hoàn thành
  • Để tạo điều khiển từ xa, cần phải tạo url của điều khiển từ xa - trong trường hợp gitlab, điều này đã đạt được bằng cách bash đơn giản
  • Khi thực hiện một cú đẩy tới gitlab_as_mebạn cần phải cụ thể về việc bạn đang đẩy nhánh nào
  • Sau khi thực hiện việc đẩy origincon trỏ cục bộ của bạn cần được "cập nhật" để khớp gitlab_as_me(cái git pull origin $branchnày)

0

Khi bạn có nhiều tài khoản git và bạn muốn khóa ssh khác

Bạn phải làm theo cùng một bước để tạo khóa ssh, nhưng hãy chắc chắn rằng bạn

ssh-keygen -t ed25519 -C "your-email-id@gmail.com" 

Nhập đường dẫn bạn muốn lưu (Ví dụ: my-pc / Desktop / .ssh / ed25519)

Thêm khóa công khai vào gitlab của bạn ( Cách thêm khóa ssh vào gitlab )

Bạn phải nhận dạng ssh mới bằng cách sử dụng comand dưới đây

ssh-add ~/my-pc/Desktop/.ssh/ed25519

(1) Bạn đang trích dẫn ai đó hoặc một cái gì đó? Nếu vậy, xin vui lòng xác định nguồn. Nếu không, xin vui lòng không sử dụng định dạng trích dẫn. (2) Thế nào là ed ed555519? Rất khó khăn khi bạn không trả lời bình luận; chỉnh sửa  câu trả lời của bạn để làm cho nó rõ ràng và đầy đủ hơn.
Scott

0
    # start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # stop :: how-to use different ssh identity files
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.