วิธีกำหนดค่า git push เพื่อตั้งค่า upstream โดยอัตโนมัติโดยไม่ใช้ -u?


109

ฉันต้องการgit push originตั้งค่าการอ้างอิงต้นน้ำโดยอัตโนมัติเมื่อฉันพุชสาขาที่สร้างในเครื่องเป็นครั้งแรก

ฉันรู้เกี่ยวกับgit push -uแต่ฉันไม่ต้องการที่จะคิดว่าฉันเคยใช้มา-uก่อนหรือไม่หรือตั้งค่าการอ้างอิงต้นน้ำ กล่าวอีกนัยหนึ่งฉันต้องการgit pushให้มีผลโดยอัตโนมัติgit push -uในการผลักดันสาขาใด ๆ ที่ยังไม่มีต้นน้ำ

เป็นไปได้หรือไม่ หากต้องใช้นามแฝงหรือสคริปต์ยูทิลิตี้ก็ไม่เป็นไร


2
คุณตรวจสอบว่าสามารถใช้push.defaultand branch.<name>.mergeoptions ในgit-config (1) ได้หรือไม่?

5
ฉันได้push.defaultตั้งค่าเป็นcurrent- นั่นคือวิธีที่ฉันสามารถพูดได้git push originโดยไม่ต้องมีการอ้างอิงหรืออัปสตรีม แต่มันไม่ได้ช่วยในการตั้งค่าต้นน้ำโดยอัตโนมัติ
จอห์น

คำตอบ:


71

คุณสามารถกำหนดค่าได้git configโดยใช้git config --global push.default currentไฟล์.

เอกสาร: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


10
ฉันมีชุดนั้น - นั่นคือวิธีที่ฉันสามารถพูดได้git push originโดยไม่ต้องใช้ refspec หรือต้นน้ำ แต่มันไม่ได้ช่วยในการตั้งค่าต้นน้ำโดยอัตโนมัติ
John

ใช้ได้ผลกับฉัน: +1:
Tim Strijdhorst

1
ใช่อย่างที่ @John กล่าวสิ่งสำคัญคือต้องจำไว้ว่าสิ่งนี้ไม่ได้ทำให้สาขาในพื้นที่ติดตามสาขาระยะไกล เพียงแค่สร้างสาขาระยะไกลที่มีชื่อเดียวกับสาขาท้องถิ่น
waldyrious

ดีพอถ้าคุณต้องการpushเช่นมีนักพัฒนาเพียงคนเดียวที่อยู่ในสาขาของเขาซึ่งแก้ไขสำเนา repo เพียงหนึ่งชุด
superarts.org

29

เนื่องจากฉันไม่คิดว่าจะทำได้โดยใช้ git config นี่คือสิ่งที่คุณสามารถทำได้ใน bash:

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

หากสาขาปัจจุบันมีสาขาการติดตามระยะไกลสาขานั้นจะเรียกเป็นgit pushอย่างอื่น git push -u


26
git config --global push.default currentตอนนี้คุณสามารถทำได้
Andrea Bergonzo

2
@AndreaBergonzo นี่เป็นคำตอบเดียวที่ดีสำหรับฉันคุณช่วยเพิ่มเป็นคำตอบได้ไหม
pdem

8
@AndreaBergonzo, @pdem - โปรดทราบว่าpush.default=currentจะสร้างเฉพาะสาขาในพื้นที่เก็บข้อมูลระยะไกลที่มีชื่อเดียวกับสาขาในพื้นที่ แต่ไม่ได้ตั้งค่าสาขาในพื้นที่เพื่อติดตามระยะไกล ฉันไม่แน่ใจว่าเหตุใดจึงเป็นเช่นนั้น แต่ก็ควรคำนึงถึง
waldyrious

23

หมายเหตุ: ความจริงที่ว่านโยบายการพุชเริ่มต้นใหม่ " simple"ขึ้นอยู่กับสาขาที่มีต้นน้ำหมายความว่า:
การตั้งค่าสาขาต้นน้ำถือเป็นขั้นตอนสมัครใจไม่ใช่ขั้นตอนอัตโนมัติที่ซ่อนอยู่

เมื่อ " git push [$there]" ไม่ได้บอกว่าจะพุชอะไรเราได้ใช้ความหมาย "การจับคู่" แบบดั้งเดิมแล้ว (สาขาทั้งหมดของคุณถูกส่งไปยังรีโมตตราบเท่าที่มีสาขาที่มีชื่อเดียวกันอยู่ที่นั่นอยู่แล้ว)

เราจะใช้simpleความหมาย "" ที่ผลักสาขาปัจจุบันไปยังสาขาที่มีชื่อเดียวกันก็ต่อเมื่อสาขาปัจจุบันถูกตั้งค่าให้รวมกับสาขาระยะไกลนั้น
มีตัวแปรการกำหนดค่าความชอบของผู้ใช้ " push.default" เพื่อเปลี่ยนแปลงสิ่งนี้


ดังนั้นการสร้างขึ้นจากคำตอบของmechanicalfishคุณสามารถกำหนดนามแฝงโดยใช้เครื่องหมายคำพูดคู่ขวา ( ) Escape ( ):"\"

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

git pu origin

Sc0ttyDเสนอในความคิดเห็นนามแฝงต่อไปนี้:

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

ในหลายบรรทัด:

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

1
ขอขอบคุณที่แสดงวิธีตั้งค่านามแฝง ฉันไม่ชัดเจนเกี่ยวกับความเกี่ยวข้องหรือความเกี่ยวข้องของส่วนแรกของคำตอบของคุณ
ยอห์น

2
@ จอห์นประเด็นของฉันคือคุณจะหลีกเลี่ยงขั้นตอนที่ควรจะเป็นขั้นตอนที่ตั้งใจ คุณสามารถตั้งค่านามแฝงนั้นได้ แต่ฉันต้องการแจ้งให้ผู้อ่านคนอื่นทราบอย่างชัดเจนว่าเหตุใดจึง-uมีตัวเลือกที่ชัดเจนนี้และเหตุใดจึงไม่มีการกำหนดค่าสำหรับการสร้างตัวเลือกดังกล่าวโดยอัตโนมัติ (จึงเป็นนามแฝง)
VonC

2
ฉันมีรายการนามแฝง zsh ใน. zshrc ของฉัน ฉันแก้ไขคำตอบนี้เพื่อสร้างนามแฝง zsh ต่อไปนี้: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 น่าสนใจขอบคุณ ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้มากขึ้น
VonC

20

ฉันมีปัญหาเดียวกัน ฉันพบนามแฝงนี้ (.gitconfig)

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

การใช้งาน: git trackหนึ่งครั้งต่อสาขาใหม่ (ขณะนี้ชำระเงินแล้ว) จากนั้นก็กดตามปกติ :)


16

คำตอบของ @VonC และ @Frexuz มีประโยชน์ แต่ทั้งสองวิธีแก้ปัญหาให้ฉัน ฉันใช้คำตอบทั้งสองคำตอบด้วยกันบางสิ่งที่เหมาะกับฉัน:

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

ผลลัพธ์ในการดำเนินการอย่างใดอย่างหนึ่งgit push -u origin $BRANCHNAMEหรือgit pushขึ้นอยู่กับว่ามีการกำหนด upstream (คุณสมบัติbranch.$BRANCHNAME.merge)

การป้อนนามแฝงนี้ในบรรทัดคำสั่งจะต้องใช้รหัส Escape ดังนั้นจึงอาจเป็นเรื่องง่ายที่สุดที่จะใช้ตัวแก้ไขเพื่อแทรกลงในไฟล์ที่ถูกต้อง ( $HOME/.gitconfig(global), .git/config(local) หรือ/etc/gitconfig(system))


3
นี่คือคำตอบที่ตรงไปตรงมาและสมบูรณ์ที่สุด หากต้องการเปิดโปรแกรมแก้ไขเริ่มต้นโดยไม่ต้องค้นหาไฟล์คุณสามารถgit config --global -e
Adam Tolley

5

ฉันแก้ไขปัญหานี้โดยใช้สคริปต์ Bash ง่ายๆนี้ จะใช้ไม่ได้กับสาขาที่มีอยู่ แต่ถ้าคุณสร้างสาขาทั้งหมดของคุณด้วยฟังก์ชันนี้คุณจะตั้งค่าสาขาต้นน้ำโดยอัตโนมัติ

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

$ 1 แสดงถึงอาร์กิวเมนต์แรกที่คุณส่งผ่านหลังจากconนั้นก็เหมือนกับการทำ:

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

... โดยทำสิ่งนี้:

con my-new-branch

5

คำตอบสั้น ๆ

หากคุณชอบที่จะชัดเจนและใช้-uตัวเลือกเมื่อจำเป็น แต่ไม่ต้องการพิมพ์ทั้งหมด:

git push -u origin foo

จากนั้นคุณสามารถใช้นามแฝงต่อไปนี้:

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

และพิมพ์:

git push-u

คำตอบยาว

โดยปกติแล้วความต้องการ-u(ชวเลข--set-upstream) คือเมื่อเราเพิ่งสร้างสาขาในพื้นที่ใหม่และยอมรับและเราต้องการผลักดันให้ต้นน้ำ ที่เก็บระยะไกลยังไม่มีสาขาใหม่ดังนั้นเราจำเป็นต้องบอกให้ git สร้างและติดตามสาขาระยะไกลก่อนที่จะกดคอมมิต สิ่งนี้จำเป็นสำหรับการผลักดันครั้งแรกในสาขาเท่านั้น นี่คือสถานการณ์ทั่วไป:

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

โดยส่วนตัวแล้วฉันชอบที่จะต้องมีความชัดเจนgit push -uเมื่อสร้างสาขาระยะไกล: มันเป็นการดำเนินการที่สำคัญมากโดยแบ่งปันสาขาใหม่ทั้งหมดให้กับโลก

git push -u origin fooแต่ผมเกลียดที่เราจะต้องชัดเจนในการเขียน ไม่เพียง แต่เป็นความเจ็บปวดในการพิมพ์ แต่ที่สำคัญกว่านั้นมันค่อนข้างผิดพลาด! เกิดข้อผิดพลาดได้ง่ายเมื่อพิมพ์ชื่อสาขาและสาขาระยะไกลใหม่จะไม่มีชื่อเดียวกับสาขาในพื้นที่ของคุณ! ในกรณีส่วนใหญ่คุณต้องการให้ที่เก็บต้นน้ำเป็นoriginและสาขาต้นน้ำมีชื่อเดียวกับสาขาในพื้นที่ของคุณ

ดังนั้นฉันจึงใช้นามแฝงต่อไปนี้ในของฉัน.gitconfigซึ่งเป็นส่วนย่อยของคำตอบที่ยอดเยี่ยมจาก Mark :

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

ตอนนี้เราสามารถทำสิ่งต่อไปนี้ได้ซึ่งยังชัดเจน แต่มีโอกาสเกิดข้อผิดพลาดน้อยกว่า:

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

3

เพียงแค่:

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

2
หัวข้อคำถาม: "จะกำหนดค่า git push เพื่อตั้งค่า upstream โดยอัตโนมัติโดยไม่ใช้ -u ได้อย่างไร" Description: "ฉันรู้เรื่องgit push -uแต่ ... " นี่จึงไม่ตอบคำถาม
จอห์น

2
@ จอห์นฉันอัปเดตคำตอบเพื่อแนะนำนามแฝงง่ายๆ
djanowski

2
@ จอห์นตอบคำถามตอนนี้หรือยัง?
djanowski

1
@ ILI4SK4RIM ขอบคุณมันบ้ามากที่คำตอบของฉันง่ายที่สุด แต่มันก็คือ -1 ¯_ (ツ) _ / ¯
djanowski

3

หากคุณต้องการใช้คุณลักษณะคอมไพล์ในตัวเฉพาะกับการกดแป้นพิมพ์ที่เป็นไปได้น้อยลงให้พิมพ์:

$ git push -u o tab H tab

และการเติมข้อความอัตโนมัติจะให้คุณ $ git push -u origin HEAD

ในการเปิดใช้งาน autocomplate บน OSX ให้ตั้งค่า~/.git-completition.bashไฟล์ที่มีเนื้อหานี้และเพิ่มบรรทัดต่อไปนี้ใน~/.bash_profileไฟล์ของคุณและรีสตาร์ทเทอร์มินัลของคุณ:

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

มันส่งผลกระทบต่อเทอร์มินัลในตัวเช่นกันเช่นใน vscode เป็นต้น


1
เติมข้อความอัตโนมัติ? คอมไพล์ไม่มีการเติมข้อความอัตโนมัติ เชลล์ของคุณ (bash? zsh?) มีชุดกฎการเติมข้อความอัตโนมัติที่โหลดอยู่ คุณสามารถให้ข้อมูลเกี่ยวกับกฎการเติมข้อความอัตโนมัติชุดใดที่คุณใช้และจะหาได้จากที่ใด
vy32

โอ้ขอบคุณในการกระทำ ฉันตอบเสร็จแล้วด้วยการตั้งค่าการเติมข้อความอัตโนมัติ
gazdagergo

หากไม่ทราบเนื้อหาของไฟล์ ~ / .git-complete.bash คำตอบของคุณจะไม่สามารถใช้งานได้
vy32

1
จุดดี. ฉันพบแหล่งที่มาของฉันgit-completition.bashและเพิ่มในคำตอบของฉัน
gazdagergo


0

หากไม่ว่าด้วยเหตุผลใดก็ตามไม่มีคำตอบอื่นใดที่เหมาะกับคุณคุณสามารถแทนที่git pushด้วยฟังก์ชันทุบตีนี้เพื่อส่งคำขอพุชซ้ำโดยอัตโนมัติพร้อมกับแฟล็กที่ถูกต้องเมื่อจำเป็น

gitpush()
{
    git push -v 2>&1 | # perform push command, pipe all output
    tee /dev/tty | # keep output on screen and pipe it forward
    (
     cmd=$(sed -n "s/^.*\(git push --set-upstream origin .*\)$/\1/p");
     [[ -n "${cmd// }" ]] && (echo "> $cmd"; eval $cmd);
    ) # if we get output that matches the command to perform, execute it
}

คุณจะต้องเสียสละส่วนความคืบหน้าของผลลัพธ์แบบพุช แต่นอกเหนือจากนั้นทุกอย่างทำงานได้ตามที่คาดไว้

ส่วนตัวผมจะใช้คำตอบ JT โจ๊บของ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.