2011-10-28 11 views
54

Làm cách nào để đặt git tự động đẩy tới repo từ xa (bao gồm tự động cung cấp cụm mật khẩu của tôi) sau mỗi lần commit đến repo cục bộ?Làm thế nào để tự động đẩy sau khi cam kết trong git?

+1

giao thức gì được bạn đẩy qua? Nếu nó nhắc mật khẩu, tôi cho rằng đây là SSH hoặc HTTP. –

+1

Ngoài ra, nó luôn luôn hữu ích với các câu hỏi git để ít nhất đề cập đến những gì hệ điều hành bạn đang sử dụng. –

+0

Tôi đặt câu hỏi về sự khôn ngoan của một thiết lập như vậy. Điều này loại bỏ bất kỳ khả năng tổ chức lại các thay đổi của bạn thành một tập hợp các cam kết khác nhau (rebasing, đặc biệt). Tôi tạo ra quá nhiều lỗi cho một thiết lập như thế này để kết thúc có ích cho tôi. – jpmc26

Trả lời

99

Trước tiên, hãy đảm bảo rằng bạn có thể đẩy thủ công mà không cần cung cấp mật khẩu của mình. Nếu bạn đang đẩy qua HTTP hoặc HTTPS, đó sẽ là trường hợp của creating a .netrc file with the login details hoặc adding your username and password into the URL for the remote. Nếu bạn đang sử dụng SSH, bạn có thể tạo một cặp khóa trong đó khóa riêng không có mật khẩu hoặc use ssh-agent to cache your private key.

Sau đó, bạn nên tạo một tập tin trong .git/hooks/post-commit chứa sau:

#!/bin/sh 
git push origin master 

... tùy dòng đó nếu bạn muốn đẩy đến một khác xa hơn origin, hoặc đẩy một chi nhánh khác ngoài master. Đảm bảo rằng bạn làm cho tệp đó có thể thực thi được.

+2

Không thể làm cho ssh-agent nhớ mật khẩu của tôi, vì vậy phải làm trống nó. Hy vọng vợ tôi sẽ không hack tài khoản của tôi :) – ulu

+0

Nói về tuỳ biến, nếu tôi muốn đẩy một số nhưng không phải tất cả các nhánh theo cách này thì sao? Ví dụ, tôi muốn tự động chỉ đẩy các nhánh có một nhánh từ xa tương ứng được ghi chú trong '.git/config' với tiền tố' feature/xy/'. –

+2

git push --all origin – Yada

6

Tạo tệp có tên "hậu cam kết" trong thư mục .git/hooks với nội dung "git push", mặc dù nếu bạn muốn tự động cung cấp mật khẩu, do đó cần phải sửa đổi.

+0

Tôi upvote Mark Longair [answer] (http://stackoverflow.com/questions/7925850/how-to-automatically-push- sau khi-cam-git/7925891 # 7925891) nếu tôi có thể. –

+3

Tôi đã làm điều đó cho bạn. – ulu

+0

Chờ đã, cái gì? Colin R hiện nằm trong top 2% :) – kim366

18

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 chi nhánh hiện tại. móc 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 = 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_mobiles post-commit hook]" 
     echo 
     git push origin $branch_name; 
    fi 
fi 

Nó đẩy các chi nhánh hiện nay, nếu nó có thể xác định tên chi nhánh với git symbolic-ref.

"How to get current branch name in Git?" xử lý vấn đề này và các cách khác để có tên chi nhánh hiện tại.

Tự động đẩy cho mỗi nhánh có thể gây phiền toái khi làm việc trong các nhánh nhiệm vụ nơi bạn mong đợi một số sausage making xảy ra (bạn sẽ không thể dễ dàng rebase sau khi đẩy). Vì vậy, móc sẽ không đẩy các nhánh kết thúc bằng hậu tố được xác định (trong ví dụ "_local").

+0

Đối với dòng đầu tiên, tôi đã phải sử dụng '#!/Bin/sh' để làm cho nó hoạt động. Nếu không, nó tiếp tục nói: 'error: không thể chạy .git/hooks/post-commit: Không có tập tin hoặc thư mục nào'. Cảm ơn bạn, tôi thích giải pháp của bạn tốt nhất. – oyalhi

+0

Cảm ơn bạn đã bình luận, @oyalhi, tôi cập nhật dòng shebang trong câu trả lời. Nó nên cổng tốt hơn bây giờ! – i4h

0

Dưới đây là hướng dẫn đơn giản để đẩy/kéo mà không cung cấp mật khẩu qua ssh cho những người sử dụng Linux và Windows (git bash)

On khách hàng của bạn:

  1. Check-out nếu bạn đã phím ssh tạo :

    $ 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 
    
  2. Nếu bạn không có bất kỳ khóa nào (hai "ls: không thể truy cập ...") tạo một khóa mới. Nếu bạn có bất kỳ phím nào 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 
    
  3. Sao chép chìa khóa của bạn đến máy chủ từ xa mà từ đó bạn muốn kéo hoặc đẩy sử dụng git:

    $ ssh-copy-id [email protected]_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 
    [email protected]_name's password: 
    
    Number of key(s) added: 1 
    
    Now try logging into the machine, with: "ssh '[email protected]_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 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.

Note2: Bạn phải đăng nhập vào máy chủ sử dụng user_name ít nhất một lần trước khi sử dụng thủ tục này (thư mục home mà phím ssh được sao chép được tạo ra trong quá trình đăng nhập đầu tiên)