Làm cách nào để đặt git tự động đẩy đến một đại diện từ xa (bao gồm cả tự động cung cấp cụm mật khẩu của tôi) sau mỗi lần cam kết với đại diện cục bộ?
Làm cách nào để đặt git tự động đẩy đến một đại diện từ xa (bao gồm cả tự động cung cấp cụm mật khẩu của tôi) sau mỗi lần cam kết với đại diện cục bộ?
Câu trả lời:
Trước tiên, hãy đảm bảo rằng bạn có thể đẩy theo cách thủ công mà không cần cung cấp mật khẩu. Nếu bạn đang đẩy qua HTTP hoặc HTTPS, đó sẽ là trường hợp tạo .netrc
tệp với chi tiết đăng nhập hoặc thêm tên người dùng và mật khẩu của bạn vào URL cho điều khiển từ xa . Nếu đang sử dụng SSH, bạn có thể tạo một cặp khóa trong đó khóa riêng tư không có mật khẩu hoặc sử dụng ssh-agent
để lưu khóa cá nhân vào bộ nhớ cache .
Sau đó, bạn nên tạo một tệp thực thi ( chmod +x
) trong .git/hooks/post-commit
đó có chứa những thứ sau:
#!/bin/sh
git push origin master
... tùy chỉnh dòng đó nếu bạn muốn đẩy đến một điều khiển từ xa khác origin
hoặc đẩy một chi nhánh khác với master
. Đảm bảo rằng bạn làm cho tệp đó có thể thực thi được.
.git/config
bằng tiền tố feature/xy/
.
Nếu bạn bắt đầu sử dụng nhiều hơn nhánh chính, bạn có thể muốn tự động đẩy nhánh hiện tại. Hook ( .git/hooks/post-commit
) của tôi trông như thế này:
#!/usr/bin/env bash
branch_name=$(git symbolic-ref --short HEAD)
retcode=$?
non_push_suffix="_local"
# Only push if branch_name was found (my be empty if in detached head state)
if [ $retcode -eq 0 ] ; then
#Only push if branch_name does not end with the non-push suffix
if [[ $branch_name != *$non_push_suffix ]] ; then
echo
echo "**** Pushing current branch $branch_name to origin [i4h post-commit hook]"
echo
git push origin $branch_name;
fi
fi
Nó đẩy nhánh hiện tại, nếu nó có thể xác định tên nhánh bằng git Symbol-ref.
" Cách lấy tên chi nhánh hiện tại trong Git? " Giải quyết vấn đề này và các cách khác để lấy tên chi nhánh hiện tại.
Việc đẩy tự động cho mọi nhánh có thể gây khó chịu khi làm việc trong các nhánh nhiệm vụ nơi bạn mong đợi một số hoạt động tạo xúc xích xảy ra (bạn sẽ không thể dễ dàng rebase sau khi đẩy). Vì vậy hook sẽ không đẩy các nhánh kết thúc bằng một hậu tố xác định (trong ví dụ "_local").
#!/bin/sh
để làm cho nó hoạt động. Nếu không nó liên tục nói: error: cannot run .git/hooks/post-commit: No such file or directory
. Cảm ơn bạn, tôi thích giải pháp của bạn nhất.
Tạo một tệp có tên "post-commit" trong thư mục .git / hooks với nội dung là "git push", tuy nhiên, nếu bạn muốn tự động cung cấp mật khẩu, thì bạn sẽ cần phải sửa đổi.
Tập lệnh git-autopush này cho phép bạn thiết lập một móc hậu cam kết, tương tự như những gì đã được đề xuất trong " Cách định cấu hình đẩy tự động? ".
Nhưng đối với cụm mật khẩu, bạn cần chạy assh-agent
.
ssh-agent
, chỉ cần sử dụng một cụm từ mật khẩu ít git
-only ssh
-key: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly
. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config
. Trên DESTINATION
cấu hình git-shell
như được hiển thị trong superuser.com/a/444899/72223 bằng cách sử dụng pubkey từ ~/.ssh/id_pushonly.pub
. git
-URL cần thiết là một cái gì đó giống như git@pushonly:path/to/repo.git
. Để gỡ lỗi: ssh git@pushonly COMMAND
phải chạy git-shell -c COMMAND
trên DESTINATION
. Để COMMAND
xemman git-shell
-t ed25519
? Tôi thường sử dụng -t rsa
, mặc dù gần đây tôi phải thêm -m PEM
vào ssh-keygen
( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
ed25519
vì nó cung cấp các dòng ngắn và tiện dụng cho ~/.ssh/authorized_keys
. Ngoài ra, điều mà DJB viết về ed255519 rất thú vị là : Bảo mật chống lại các kênh bên (Spectre), ít CPU hơn, v.v. BTW, khi xử lý sshd
các s cũ , tôi thường tạo một khóa đặc biệt cho chúng và sau đó cấu hình điều này trong ~/.ssh/config
.
Đây là hướng dẫn đơn giản để đẩy / kéo mà không cần cung cấp cụm mật khẩu qua ssh cho những người sử dụng Linux và Windows (git bash)
Về khách hàng của bạn:
Kiểm tra xem bạn đã tạo khóa ssh chưa:
$ ls ~/.ssh/id_rsa.pub; ls ~/.ssh/id_dsa.pub
/c/Users/Cermo/.ssh/id_rsa.pub <-- I have RSA key
ls: cannot access '/c/Users/Cermo/.ssh/id_dsa.pub': No such file or directory
Nếu bạn không có bất kỳ khóa nào (hai dòng "ls: không thể truy cập ..."), hãy tạo một khóa mới. Nếu bạn có bất kỳ phím nào, hãy bỏ qua bước này.
$ ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Cermo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <-- press Enter
Enter same passphrase again: <-- press Enter
Sao chép khóa của bạn vào máy chủ từ xa mà bạn muốn kéo hoặc đẩy bằng git:
$ ssh-copy-id user_name@server_name
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you
are prompted now it is to install the new keys
user_name@server_name's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user_name@server_name'"
and check to make sure that only the key(s) you wanted were added.
Lưu ý: Bạn sẽ phải cung cấp mật khẩu trong quá trình hoạt động này. Sau đó, các hoạt động kéo / đẩy của bạn sẽ không yêu cầu mật khẩu.
Lưu ý 2: Bạn phải đăng nhập vào máy chủ bằng user_name ít nhất một lần trước khi sử dụng quy trình này (thư mục chính mà các khóa ssh được sao chép được tạo trong lần đăng nhập đầu tiên)
Đây là tập lệnh bash để git tự động push
đến repo từ xa
$ cd /path/to/your/repository
sau đó$ push
Đặt tập lệnh này vào một tệp chẳng hạn $HOME/.ssh/push
#!/bin/bash
# Check connection
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent` > /dev/null
# Check if git config is configured
if [ ! $(git config user.name) ]
then
git config --global user.name <user_name>
git config --global user.email <user_email>
fi
# Check if expect is installed
if [[ ! $(dpkg -l | grep expect) ]]
then
apt-get update > /dev/null
apt-get install --assume-yes --no-install-recommends apt-utils expect > /dev/null
fi
# Check identity
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent > /dev/null
# Clean and push repo
REMOTE=$(git remote get-url origin)
URL=git@github.com:${REMOTE##*github.com/}
[[ $REMOTE == "http"* ]] && git remote set-url origin $URL
git add . && git commit -m "test automatically push to a remote repo"
git status && git push origin $(git rev-parse --abbrev-ref HEAD) --force
Liên kết nó với /bin
thư mục để nó có thể được gọi bằng $ push
lệnh
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
Nếu bạn đang sử dụng Husky, nó sẽ ghi đè post-commit
tệp hooks của bạn theo mặc định.
Chúng tôi đang sử dụng lệnh này trong package.json để tự động rebase-và đẩy mọi cam kết thành master. (Lần chạy đầu tiên yarn add --dev git-branch-is
.)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}