Làm thế nào để cấu hình git push để tự động thiết lập ngược dòng mà không có -u?


100

Tôi muốn git push origintự động đặt tham chiếu ngược dòng khi tôi đẩy một nhánh được tạo cục bộ lần đầu tiên.

Tôi biết về git push -u, nhưng tôi không muốn phải suy nghĩ về việc liệu tôi đã sử dụng -utrước đây hay chưa hoặc đặt tham chiếu ngược dòng. Nói cách khác, tôi muốn git pushtự động có tác dụng đối git push -uvới bất kỳ lần đẩy nào của một nhánh chưa có phần ngược dòng.

Điều này có khả thi không? Nếu nó yêu cầu bí danh hoặc tập lệnh tiện ích, điều đó tốt.


2
Bạn đã kiểm tra xem có thể sử dụng các tùy chọn push.defaultbranch.<name>.mergetrong git-config (1) không?

5
Tôi đã push.defaultđặt thành current- đó là cách tôi có thể nói git push originmà không cần refspec hoặc ngược dòng. Nhưng nó không giúp ích gì với việc tự động thiết lập ngược dòng.
John

Câu trả lời:


61

Bạn có thể cấu hình nó bằng git configcách sử dụng git config --global push.default current.

Tài liệu: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


8
Tôi có tập hợp đó - đó là cách tôi có thể nói git push originmà không cần refspec hoặc ngược dòng. Nhưng nó không giúp ích gì với việc tự động thiết lập ngược dòng.
John

Làm việc cho tôi: +1:
Tim Strijdhorst

Vâng, như @John nói, điều quan trọng cần lưu ý là điều này không làm cho chi nhánh cục bộ theo dõi chi nhánh từ xa; nó chỉ tạo nhánh từ xa có cùng tên với nhánh cục bộ.
waldyrious

Đủ tốt nếu bạn chỉ cần push, chẳng hạn như chỉ có một nhà phát triển trong chi nhánh của họ, người chỉ chỉnh sửa một bản sao của repo.
superarts.org

26

Vì tôi không nghĩ rằng điều này có thể thực hiện được bằng cách sử dụng git config, đây là những gì bạn có thể làm trong bash:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

Nếu nhánh hiện tại có nhánh theo dõi từ xa, nó gọi git pushngược lại nó sẽ gọi git push -u


24
Bây giờ bạn có thể làm git config --global push.default current.
Andrea Bergonzo

2
@AndreaBergonzo đây là câu trả lời tốt duy nhất đối với tôi, bạn có thể thêm nó làm câu trả lời được không?
pdem

6
@AndreaBergonzo, @pdem - lưu ý rằng push.default=currentchỉ tạo một nhánh trong kho lưu trữ từ xa có cùng tên với nhánh cục bộ, nhưng không đặt chi nhánh cục bộ để theo dõi từ xa. Tôi không chắc tại sao lại xảy ra trường hợp này, nhưng điều này đáng lưu ý.
waldyrious

22

Lưu ý: thực tế là chính sách đẩy mặc định mới " simple" dựa trên một nhánh có nhánh ngược dòng có nghĩa là:
việc đặt nhánh ngược dòng được xem như một bước tự nguyện, không phải là một bước tự động ẩn

Khi " git push [$there]" không nói phải đẩy cái gì, chúng tôi đã sử dụng ngữ nghĩa "đối sánh" truyền thống cho đến nay (tất cả các nhánh của bạn đã được gửi đến điều khiển từ xa miễn là đã có các nhánh cùng tên ở đó).

Chúng tôi sẽ sử dụng simplengữ nghĩa "" để đẩy nhánh hiện tại đến nhánh có cùng tên, chỉ khi nhánh hiện tại được thiết lập để tích hợp với nhánh ở xa đó .
Có một biến cấu hình tùy chọn người dùng " push.default" để thay đổi điều này.


Vì vậy, xây dựng từ mechanicalfish 's câu trả lời , bạn có thể xác định một bí danh, với dấu ngoặc kép bên phải ( ") thoát ( \"):

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"

git pu origin

Sc0ttyD đề xuất trong các nhận xét bí danh sau:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

Trong nhiều dòng:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
           git push -u origin $(git symbolic-ref --short HEAD) || 
           git push'

1
Cảm ơn bạn đã hướng dẫn cách thiết lập bí danh. Tuy nhiên, tôi không rõ ràng về mối liên hệ hoặc mức độ liên quan của phần đầu tiên trong câu trả lời của bạn.
John

2
@John quan điểm của tôi là: bạn sẽ phá vỡ một bước được cho là có chủ ý. Bạn có thể thiết lập bí danh đó, nhưng tôi muốn nói rõ với những người đọc khác lý do tại sao -utùy chọn rõ ràng này tồn tại và tại sao không có cấu hình để tạo tùy chọn tự động (do đó là bí danh).
VonC

2
Tôi có một danh sách các bí danh zsh trong .zshrc của mình. Tôi đã sửa đổi câu trả lời này để tạo bí danh zsh sau:alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ttyD

2
@ Sc0ttyD Thật thú vị, cảm ơn bạn. Tôi đã bao gồm bình luận của bạn trong câu trả lời để hiển thị nhiều hơn.
VonC

17

Tôi đã có cùng một vấn đề. Tôi đã tìm thấy bí danh này (.gitconfig)

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

Sử dụng: git trackmột lần cho mỗi chi nhánh mới (hiện đã thanh toán). Sau đó chỉ cần đẩy như bình thường :)


15

Câu trả lời của @VonC và @Frexuz rất hữu ích, nhưng cả hai giải pháp của họ đều gây ra lỗi cho tôi. Sử dụng cả hai câu trả lời của họ, tôi tập hợp một số thứ phù hợp với tôi:

    [alias]
    pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push

Điều này dẫn đến việc thực thi hoặc git push -u origin $BRANCHNAMEhoặc git push, tùy thuộc vào việc ngược dòng (thuộc tính branch.$BRANCHNAME.merge) của nó có được xác định hay không.

Nhập bí danh này trên dòng lệnh sẽ yêu cầu mã thoát, vì vậy, có lẽ dễ nhất là sử dụng trình chỉnh sửa để chèn vào đúng tệp ( $HOME/.gitconfig(toàn cầu), .git/config(cục bộ) hoặc /etc/gitconfig(hệ thống))


3
Đây là câu trả lời thẳng thắn và đầy đủ nhất. Để mở trình biên tập mặc định mà không săn tìm các tập tin, bạn có thểgit config --global -e
Adam Tolley

5

Câu trả lời ngắn

Nếu bạn thực sự muốn rõ ràng và sử dụng -utùy chọn này khi cần thiết, nhưng không muốn nhập toàn bộ:

git push -u origin foo

Sau đó, bạn có thể sử dụng bí danh sau:

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Và chỉ cần gõ:

git push-u

Câu trả lời dài

Thông thường, nhu cầu về -u(viết tắt của --set-upstream) là khi chúng ta vừa tạo một nhánh cục bộ mới và cam kết, đồng thời chúng ta muốn đẩy nó ngược dòng. Kho lưu trữ từ xa chưa có nhánh mới, vì vậy chúng ta cần yêu cầu git tạo và theo dõi nhánh từ xa trước khi đẩy cam kết. Điều này chỉ cần thiết cho lần đẩy đầu tiên trên nhánh. Đây là một kịch bản điển hình:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push -u origin foo      # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

Cá nhân tôi thích sự cần thiết phải rõ ràng git push -ukhi tạo nhánh từ xa: đó là một hoạt động khá quan trọng, chia sẻ một nhánh hoàn toàn mới với thế giới.

Tuy nhiên, tôi ghét rằng chúng ta phải viết một cách rõ ràng git push -u origin foo. Nó không chỉ gây khó khăn khi gõ, mà quan trọng hơn, nó khá dễ xảy ra lỗi! Bạn rất dễ mắc lỗi khi nhập tên chi nhánh và chi nhánh từ xa mới sẽ không trùng tên với chi nhánh cục bộ của bạn! Trong hầu hết các trường hợp, bạn thực sự muốn kho lưu trữ ngược dòng originvà nhánh ngược dòng có cùng tên với nhánh cục bộ của bạn.

Do đó, tôi đang sử dụng bí danh sau trong của mình .gitconfig, đây là một tập hợp con của câu trả lời tuyệt vời do Mark cung cấp :

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

Bây giờ, chúng ta có thể làm như sau, thao tác này vẫn rõ ràng nhưng ít bị lỗi hơn:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

4

Tôi đã giải quyết vấn đề này bằng cách sử dụng tập lệnh Bash đơn giản này. Nó sẽ không hoạt động trên các nhánh hiện có, nhưng nếu bạn tạo tất cả các nhánh của mình bằng chức năng này, bạn sẽ luôn tự động đặt nhánh ngược dòng của mình.

function con { git checkout -b $1 && git push --set-upstream origin $1; }

$ 1 đại diện cho đối số đầu tiên bạn truyền sau conđó, vì vậy nó giống như thực hiện:

git checkout -b my-new-branch && git push -u my-new-branch

... bằng cách làm điều này:

con my-new-branch

2

Đơn giản:

$ alias gush="git push -u origin HEAD"

2
Tiêu đề câu hỏi: "Làm thế nào để cấu hình git push để tự động thiết lập ngược dòng mà không có -u?" Mô tả: "Tôi biết về git push -u, nhưng ...". Vì vậy, điều này không trả lời câu hỏi.
John

2
@John Tôi đã cập nhật câu trả lời của mình để đề xuất một bí danh đơn giản.
djanowski

2
@John Nó có trả lời câu hỏi bây giờ không?
djanowski 20/09/2016

1
@ ILI4SK4RIM Cảm ơn, nó thật điên rồ rằng câu trả lời của tôi là đơn giản nhất, nhưng nó là -1 _ (ツ) _ / ¯
djanowski


1

Nếu bạn chỉ muốn sử dụng các tính năng git tích hợp với ít phím có thể hơn, chỉ cần nhập:

$ git push -u o tab H tab

và tự động hoàn thành sẽ cung cấp cho bạn $ git push -u origin HEAD

Để bật tính năng tự động ghép trên OSX, hãy thiết lập ~/.git-completition.bashtệp có nội dung này và thêm các dòng sau vào ~/.bash_profiletệp của bạn và khởi động lại thiết bị đầu cuối của bạn:

# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Nó cũng ảnh hưởng đến các thiết bị đầu cuối tích hợp, như thiết bị đầu cuối trong vscode, v.v.


tự động hoàn thành? git không có tính năng tự động hoàn thành. Trình bao của bạn (bash? Zsh?) Đã tải một tập hợp các quy tắc tự động hoàn thành. Bạn có thể cung cấp thông tin về bộ quy tắc tự động hoàn thành bạn đang sử dụng không và lấy chúng ở đâu?
vy32

Ồ, để cảm ơn. Tôi đã hoàn thành câu trả lời của mình với cài đặt tự động hoàn thành của mình.
gazdagergo

Nếu không biết nội dung của tệp ~ / .git-complete.bash, câu trả lời của bạn không thể hoạt động được.
vy32

1
Điểm tốt. Tôi đã tìm thấy nguồn của tôi git-completition.bashvà thêm vào câu trả lời của tôi.
gazdagergo
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.