Git push'u -u olmadan otomatik olarak yukarı akışı ayarlamak için nasıl yapılandırabilirim?


106

git push originYerel olarak oluşturulmuş bir dalı ilk kez ittiğimde yukarı akış referansını otomatik olarak ayarlamak istiyorum .

Biliyorum git push -u, ancak daha -uönce kullanıp kullanmadığımı veya başka bir şekilde bir yukarı akış referansı oluşturup oluşturmadığımı düşünmek zorunda kalmak istemiyorum . Başka bir deyişle, halihazırda bir yukarı akışa sahip olmayan bir dalın herhangi bir itişinde git pushetkisinin otomatik olarak olmasını istiyorum git push -u.

Mümkün mü? Bir takma ad veya yardımcı program komut dosyası gerektiriyorsa, sorun değil.


2
Git-config (1) içindeki push.defaultve branch.<name>.mergeseçeneklerini kullanmanın mümkün olup olmadığını kontrol ettiniz mi?

5
Ben var push.defaultayarlı current- ben sadece söyleyebiliriz nasıl git push originbir refspec olmadan veya akıntıya. Ancak otomatik olarak yukarı akış ayarına yardımcı olmuyor.
John

Yanıtlar:


67

Sen ile yapılandırabilirsiniz git configkullanarak git config --global push.default current.

Dokümanlar: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


9
O setim var - bu git push originşekilde bir refspec veya upstream olmadan söyleyebilirim . Ancak otomatik olarak yukarı akış ayarına yardımcı olmuyor.
John

Benim için çalışıyor: +1:
Tim Strijdhorst

1
@John söylediği gibi Evet, bu olmadığını akılda tutmak önemlidir değil yerel şube uzak bir parça yapmak; sadece yerel şubeyle aynı adı taşıyan uzak dalı oluşturur.
waldyrious

Sadece ihtiyacınız varsa yeterince iyi push, örneğin şubesinde bir deponun yalnızca bir kopyasını düzenleyen yalnızca bir geliştirici var.
superarts.org

29

Git config kullanarak bunun mümkün olduğunu düşünmediğim için, işte bash'da yapabilecekleriniz:

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

Mevcut şubenin uzaktan takip şubesi varsa, git pushaksi takdirde arar git push -u


25
Şimdi yapabilirsiniz git config --global push.default current.
Andrea Bergonzo

2
@AndreaBergonzo bu benim için tek iyi cevap, cevap olarak ekleyebilir misiniz?
pdem

8
@AndreaBergonzo, @pdem - o notu push.default=currentsadece yerel şubesi ile aynı ada sahip uzaktan depoda bir şube oluşturur, ancak yok değil uzak bir takip etmek için yerel şube ayarlayın. Neden böyle olduğundan emin değilim ama akılda tutmaya değer.
waldyrious

23

Not: Yeni varsayılan push politikasının " simple" yukarı akışlı bir şubeye dayandığı gerçeği şu anlama gelir:
bir yukarı akış şubesi ayarlamanın gizli bir otomatik adım değil, gönüllü bir adım olarak görülmesi

" git push [$there]" Neyi iteceğimizi söylemediğinde, şimdiye kadar geleneksel "eşleştirme" semantiğini kullandık (orada zaten aynı adda dallar olduğu sürece tüm şubeleriniz uzaktan kumandaya gönderildi).

Sadece geçerli dal o uzak dal ile entegre olacak şekilde ayarlandığında, geçerli dalısimple aynı adı taşıyan şubeye iten " " semantiğini kullanacağız . Bunu değiştirmek için bir kullanıcı tercihi yapılandırma değişkeni " " vardır.
push.default


Dan kadar bina Yani mechanicalfish 'ın cevabı , siz (sağ çift tırnak, bir takma ad tanımlayabilirsiniz "() kaçtı \"):

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

git pu origin

Sc0ttyD , yorumlarda aşağıdaki takma adı önermektedir :

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

Birden çok satırda:

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

1
Takma adı nasıl ayarlayacağınızı gösterdiğiniz için teşekkür ederiz. Yine de cevabınızın ilk kısmıyla bağlantı veya alaka konusunda net değilim.
John

2
@John benim anlatmak istediğim: kasıtlı olması gereken bir adımı atlatırsın. Bu takma adı ayarlayabilirsiniz, ancak diğer okuyuculara bu açık -useçeneğin neden var olduğunu ve neden bu seçeneği otomatik hale getirmek için bir yapılandırma olmadığını (dolayısıyla takma adı) açıklamak istedim .
VonC

2
.Zshrc dosyamda zsh takma adları listesi var. Aşağıdaki zsh takma adını oluşturmak için bu yanıtı değiştirdim: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 İlginç, teşekkür ederim. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC

20

Ben de aynı sorunu yaşadım. Bu takma adı buldum (.gitconfig)

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

Kullanım: git trackher yeni şube için bir kez (şu anda kontrol edilmiş). Sonra normal bir şekilde itin :)


16

@VonC ve @Frexuz'un cevapları yardımcı oluyor, ancak her iki çözümü de benim için bir hata üretiyor. Her iki cevabını da kullanarak benim için işe yarayan bir şeyi bir araya getirdim:

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

Bu , yukarı akışının (özelliğinin ) tanımlanıp tanımlanmadığına bağlı olarak git push -u origin $BRANCHNAMEveya çalıştırılmasına neden olur .git pushbranch.$BRANCHNAME.merge

Bu takma adı komut satırına girmek kaçış kodları gerektirecektir, bu nedenle doğru dosyaya ( $HOME/.gitconfig(global), .git/config(yerel) veya /etc/gitconfig(sistem)) eklemek için bir düzenleyici kullanmak muhtemelen en kolayıdır.


3
Bu en basit ve eksiksiz cevaptır. Varsayılan düzenleyiciyi dosyayı git config --global -e
aramadan

5

Bu sorunu bu basit Bash betiğini kullanarak çözdüm. Mevcut şubelerde çalışmaz, ancak tüm şubelerinizi bu işlevle oluşturursanız, her zaman yukarı akış şubenizi otomatik olarak ayarlamış olursunuz.

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

$ 1, geçtiğiniz ilk bağımsız değişkeni temsil eder con bu yüzden aynen yapmak gibi:

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

... sadece bunu yaparak:

con my-new-branch

5

Kısa cevap

Açıkça konuşmayı ve -ugerektiğinde seçeneği kullanmayı seviyorsanız , ancak tamamını yazmak istemiyorsanız:

git push -u origin foo

Ardından aşağıdaki takma adı kullanabilirsiniz:

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

Ve basitçe şunu yazın:

git push-u

Uzun cevap

Tipik olarak, -u(kısaltması) için ihtiyaç, --set-upstreamyeni bir yerel şube ve commit oluşturduğumuz ve bunu yukarı akışa itmek istediğimiz zamandır. Uzak depoda henüz yeni dal yok, bu yüzden git'e commit'i zorlamadan önce uzak dalı oluşturmasını ve izlemesini söylememiz gerekiyor. Bu, yalnızca daldaki ilk itme için gereklidir. İşte tipik bir senaryo:

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

Şahsen, git push -uuzak şubeyi oluştururken açık olma ihtiyacını seviyorum : dünyaya yepyeni bir şubeyi paylaşan oldukça önemli bir işlem.

Ancak, açıkça yazmak zorunda olmamızdan nefret ediyorum git push -u origin foo. Sadece yazmak için bir acı değil, daha da önemlisi, hataya oldukça açık! Şube adını yazarken hata yapmak kolaydır ve yeni uzak şubenin adı yerel şubenizle aynı olmayacaktır! Çoğu durumda, gerçekten, yukarı akış havuzununorigin ve yukarı akış şubesinin yerel şubenizle aynı ada sahip .

Bu nedenle, Mark tarafından sağlanan.gitconfig mükemmel cevabın bir alt kümesi olan my'de aşağıdaki takma adı kullanıyorum :

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

Şimdi, hala açık olan ancak hataya daha az meyilli olan aşağıdakileri yapabiliriz:

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

Basitçe:

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

2
Soru başlığı: "git push, -u olmadan yukarı akışı otomatik olarak ayarlayacak şekilde nasıl yapılandırılır?" Açıklama: "Biliyorum git push -uama ...". Yani bu soruya cevap vermiyor.
John

2
@John Basit bir takma ad önermek için cevabımı güncelledim.
djanowski

2
@John soruyu şimdi cevaplıyor mu?
djanowski

1
@ ILI4SK4RIM Teşekkürler, cevabımın en basit olması çılgınca, yine de -1 ¯_ (ツ) _ / ¯
djanowski

3

Yerleşik git özelliklerini yalnızca mümkün olan daha az tuşa basarak kullanmak istiyorsanız, şunu yazın:

$ git push -u o tab H tab

ve otomatik tamamlama size verecek $ git push -u origin HEAD

OSX'te autocomplate'i etkinleştirmek için bu içeriğe sahip bir ~/.git-completition.bashdosya oluşturun ve aşağıdaki satırları ~/.bash_profiledosyanıza ekleyin ve terminalinizi yeniden başlatın:

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

Vscode vb. Gibi yerleşik terminalleri de etkiler.


1
otomatik tamamlama? git'in otomatik tamamlaması yok. Kabuğunuzda (bash? Zsh?) Bir dizi otomatik tamamlama kuralı yüklü. Hangi otomatik tamamlama kurallarını kullandığınız ve bunları nereden alacağınız hakkında bilgi verebilir misiniz?
vy32

Oh, gerçekten teşekkürler. Cevabımı otomatik tamamlama ayarlarımla tamamladım.
gazdagergo

~ / .Git-complete.bash dosyanızın içeriğini bilmeden, yanıtınız işlevsel hale getirilemez.
vy32

1
İyi bir nokta. Kaynağımı buldum ve cevabıma git-completition.bashekledim.
gazdagergo


0

Hangi nedenle olursa olsun, diğer yanıtların hiçbiri sizin için işe yaramazsa, git pushgerektiğinde itme isteğini doğru bayraklarla otomatik olarak yeniden göndermek için bu bash işlevini kullanabilirsiniz.

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
}

Push çıktısının ilerleme kısmını feda edeceksiniz, ancak bunun dışında her şey beklendiği gibi çalışıyor.

Şahsen, JT Jobe'nin cevabını kullanacağım .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.