Viết bài này cho những người mới bắt đầu với Git và BitBucket trên Windows & những người không quen thuộc với Bash (vì đây là vấn đề phổ biến và là kết quả cao của Google khi tìm kiếm thông báo lỗi trong câu hỏi).
Đối với những người không quan tâm đến HTTPS và những người đang tìm cách khắc phục nhanh, hãy cuộn xuống cuối câu trả lời này để được hướng dẫn trong FOR THE LAZY
Đối với những người đang tìm cách giải quyết vấn đề thực tế, hãy làm theo các hướng dẫn dưới đây:
Khắc phục sự cố SSH nhanh nhất có thể
Đây là một bộ hướng dẫn xuất phát từ URL được liên kết bởi VonC. Nó đã được sửa đổi để trở nên kiên cường và cô đọng nhất có thể.
Đặt thông tin toàn cầu của bạn nếu bạn chưa có:
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
Kiểm tra OpenSSH:
$ ssh -v localhost
OpenSSH_4.6p1, OpenSSL...
Thấy cái gì như vậy không?
- Có: Tiếp tục.
- Không: Bỏ qua phần FOR THE LAZY hoặc theo dõi bài viết được liên kết từ VonC.
Xem bạn đã tạo khóa chưa:
$ ls -a ~/.ssh/id_*
Nếu có hai tệp, bạn có thể bỏ qua bước tiếp theo.
$ ssh-keygen
Để lại mọi thứ như mặc định, nhập cụm mật khẩu. Bây giờ bạn sẽ thấy kết quả với lệnh này:
$ ls -a ~/.ssh/id_*
Kiểm tra tệp cấu hình hiện có:
$ ls -a ~/.ssh/config
Nếu bạn nhận được kết quả, hãy kiểm tra tệp này để biết thông tin sai lệch. Nếu không có tệp nào tồn tại, hãy làm như sau:
$ echo "Host bitbucket.org" >> ~/.ssh/config
$ echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config
Xác nhận nội dung:
$ cat ~/.ssh/config
Host bitbucket.org
IdentityFile ~/.ssh/id_rsa
- Không gian duy nhất trước "IdentityFile" là bắt buộc.
Kiểm tra xem bạn có bắt đầu tác nhân SSH mỗi khi bạn chạy GitBash không:
$ cat ~/.bashrc
- Nếu bạn thấy một hàm được gọi
start_agent
, bước này đã được hoàn thành.
- Nếu không có tập tin, tiếp tục.
- Nếu có một tệp không chứa chức năng này, bạn đang ở trong một tình huống khó khăn. Có thể an toàn để thêm vào nó (sử dụng các hướng dẫn bên dưới) nhưng có thể không! Nếu không chắc chắn, hãy tạo bản sao lưu .bashrc của bạn trước khi làm theo các hướng dẫn bên dưới hoặc bỏ qua phần FOR FOR LAZY .
Nhập thông tin sau vào GitBash để tạo tệp .bashrc của bạn:
$ echo "SSH_ENV=$HOME/.ssh/environment" >> ~/.bashrc
$ echo "" >> ~/.bashrc
$ echo "# start the ssh-agent" >> ~/.bashrc
$ echo "function start_agent {" >> ~/.bashrc
$ echo " echo \"Initializing new SSH agent...\"" >> ~/.bashrc
$ echo " # spawn ssh-agent" >> ~/.bashrc
$ echo " /usr/bin/ssh-agent | sed 's/^echo/#echo/' > \"\${SSH_ENV}\"" >> ~/.bashrc
$ echo " echo succeeded" >> ~/.bashrc
$ echo " chmod 600 \"\${SSH_ENV}\"" >> ~/.bashrc
$ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc
$ echo " /usr/bin/ssh-add" >> ~/.bashrc
$ echo "}" >> ~/.bashrc
$ echo "" >> ~/.bashrc
$ echo "if [ -f \"\${SSH_ENV}\" ]; then" >> ~/.bashrc
$ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc
$ echo " ps -ef | grep \${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {" >> ~/.bashrc
$ echo " start_agent;" >> ~/.bashrc
$ echo " }" >> ~/.bashrc
$ echo "else" >> ~/.bashrc
$ echo " start_agent;" >> ~/.bashrc
$ echo "fi" >> ~/.bashrc
Xác minh tệp đã được tạo thành công (tệp của bạn chỉ khác ở nơi "yourusername" xuất hiện):
$ cat ~/.bashrc
SSH_ENV=/c/Users/yourusername/.ssh/environment
# start the ssh-agent
function start_agent {
echo "Initializing new SSH agent..."
# spawn ssh-agent
/usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
echo succeeded
chmod 600 "${SSH_ENV}"
. "${SSH_ENV}" > /dev/null
/usr/bin/ssh-add
}
if [ -f "${SSH_ENV}" ]; then
. "${SSH_ENV}" > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
- Đóng GitBash và mở lại.
- Bạn nên được hỏi về cụm mật khẩu của bạn (đối với tệp SSH bạn đã tạo trước đó).
- Nếu không có lời nhắc, bạn đã không đặt cụm mật khẩu hoặc GitBash không chạy tập lệnh .bashrc (sẽ là số lẻ nên hãy xem xét nội dung của nó!). Nếu bạn đang chạy cái này trên máy Mac (OS X),
.bashrc
thì không được thực thi theo mặc định - .bash_profile
là. Để khắc phục điều này, hãy đặt đoạn mã này vào .bash_profile
:[[ -s ~/.bashrc ]] && source ~/.bashrc
Nếu bạn không nhập cụm mật khẩu, bạn sẽ thấy một cái gì đó như thế này khi bắt đầu GitBash:
Initializing new SSH agent...
succeeded
Identity added: /c/Users/yourusername/.ssh/id_rsa (/c/Users/yourusername/.ssh/id_rsa)
Và sau đây sẽ trả về kết quả:
$ ssh-add -l
Tuy nhiên, nếu bạn nhận được những điều sau đây ssh-add -l
:
Could not open a connection to your authentication agent.
Nó không sinh ra tác nhân SSH và .bashrc của bạn có thể là nguyên nhân.
Nếu, khi bắt đầu GitBash, bạn sẽ thấy điều này:
Initializing new SSH agent...
sh.exe": : No such file or directory
Điều đó có nghĩa là bạn đã quên thoát $ bằng \ khi lặp lại tệp (nghĩa là các biến đã được mở rộng). Tạo lại .bashrc của bạn để giải quyết vấn đề này.
Xác minh tác nhân đang chạy và khóa của bạn đã được thêm:
$ ssh-add -l
Nên trả lại một cái gì đó tương tự như thế này:
2048 0f:37:21:af:1b:31:d5:cd:65:58:b2:68:4a:ba:a2:46 /Users/yourusername/.ssh/id_rsa (RSA)
Chạy lệnh sau để lấy khóa công khai của bạn:
$ cat ~/.ssh/id_rsa.pub
(cần trả lại một cái gì đó bắt đầu bằng "ssh-rsa ......"
- Nhấp vào biểu tượng cửa sổ GitBash
- Nhấp vào Chỉnh sửa
- Nhấp vào Đánh dấu
- Làm nổi bật khóa chung bằng chuột của bạn (bao gồm
ssh-rsa
bit đầu và == youremail@yourdomain.com
bit sau )
- Nhấp chuột phải vào cửa sổ (thực hiện một bản sao)
- Dán khóa công khai của bạn vào Notepad.
- Xóa tất cả các dòng mới sao cho nó chỉ là một dòng duy nhất.
- Nhấn
CTRL+A
sau đó CTRL+C
để sao chép khóa công khai một lần nữa vào clipboard của bạn.
Định cấu hình khóa riêng của bạn với BitBucket bằng cách thực hiện các bước sau:
- Mở trình duyệt của bạn và điều hướng đến trang BitBucket.org
- Đăng nhập vào BitBucket.org
- Nhấp vào hình đại diện của bạn (trên cùng bên phải)
- Nhấp vào Quản lý tài khoản
- Nhấp vào Khóa SSH (bên dưới Bảo mật trên menu bên trái)
- Nhấp vào Thêm khóa
- Nhập
Global Public Key
cho Nhãn
- Dán khóa công khai bạn đã sao chép từ Notepad
Một Global Public Key
mục nên được hiển thị trong danh sách các phím của bạn.
- Quay trở lại GitBash
- cd vào thư mục chứa dự án của bạn
- Thay đổi nguồn gốc của bạn thành biến thể SSH (sẽ không có nếu bạn chạy các bước CHO THE LAZY )
Kiểm tra điều khiển từ xa của bạn:
$ git remote -v
Chuyển sang url SSH:
$ git remote set-url origin git@bitbucket.org:youraccount/yourproject.git
Kiểm tra mọi thứ đang hoạt động:
$ git remote show origin
Bạn sẽ thấy một cái gì đó như thế này:
Warning: Permanently added the RSA host key for IP address '...' to the list of known hosts.
* remote origin
Fetch URL: git@bitbucket.org:youruser/yourproject.git
Push URL: git@bitbucket.org:youruser/yourproject.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (fast-forwardable)
LÀM XONG!
Bạn có thể chọn sử dụng HTTPS thay vì SSH. Nó sẽ yêu cầu bạn nhập mật khẩu của bạn trong các hoạt động từ xa (nó được lưu tạm thời sau khi bạn nhập mật khẩu một lần). Đây là cách bạn có thể định cấu hình HTTPS:
CHO LAZY
Bạn nên khắc phục sự cố SSH như được mô tả bởi VonC; tuy nhiên, nếu bạn đang vội vã cam kết và không có công cụ / thời gian / kiến thức để tạo khóa công khai mới ngay bây giờ , hãy đặt nguồn gốc của bạn thành phương án thay thế HTTPS:
> https://accountname@bitbucket.org/accountname/reponame.git
Sử dụng một công cụ GUI như TortoiseGit hoặc các công cụ dòng lệnh .
Dưới đây là tài liệu của URL nguồn gốc thay thế này.
Dòng lệnh để thêm một nguồn gốc nếu không tồn tại:
git remote add origin https://accountname@bitbucket.org/accountname/reponame.git
Dòng lệnh để thay đổi nguồn gốc hiện có:
git remote set-url origin https://accountname@bitbucket.org/accountname/reponame.git
LƯU Ý: tên tài khoản của bạn không phải là email của bạn.
Bạn cũng có thể muốn đặt thông tin toàn cầu của mình:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Sau đó thử lại lần nữa (không cần phải cam kết lại)
git push origin master