Uzak depoya sıfırlamaya nasıl zorlanır?


96

Uzak ana şubemiz bir şekilde berbat oldu. Mevcut geliştirme kodu, en son taahhütlerle birlikte ana dalda. Açıkçası, geliştirme kodu ana dal için hazır değil.

Bu yüzden yerel depomda, en son etiketi sıfırladım git reset --hard (Tag). Ana dal artık yerel depomda doğrudur. Şimdi değişiklikleri uzak depoya göndermeye çalıştığımda git push origin master, bir hata alıyorum:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Bu yüzden etrafa baktıktan sonra --forceseçeneği buldum . Bu yüzden uzak depoya zorla bastırdım git push --force origin masterve hala bir hata alıyorum:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

Master'ı çekemiyorum, çünkü master'da bulunamayan geliştirme kodunu içeriyor.


3
Sanırım mesaj, hızlı ileri olmayan bir itme yapma hakkına sahip olmadığınız anlamına geliyor.
svick

3
Haklıydın teşekkürler. Uzaktaki havuz için yapılandırma dosyasında denyNonFastforwards = true,. Bunu yanlış olarak değiştirdim, değişikliklerimi aktardım ve sonra tekrar doğru olarak değiştirdim. Yardım için herkese tekrar teşekkürler.
samwell

2
@samwell lütfen svick'in yanıtını kabul edildi olarak işaretleyin
hultqvist

@samwell svick'in cevabı sizin için işe yaradı mı, yaramadı mı?
Songo

Samwell'in yaptığı gibi inkarNonFastForwards'ın nasıl devre dışı bırakılacağına dair ayrıntılara ihtiyaç duyanlar için daha fazla talimat burada bulunabilir: stackoverflow.com/a/43721579/2073804
ron190

Yanıtlar:


154

Mesaj, hızlı ileri olmayan itme yapmanıza izin verilmediğini gösterir.

Uzak deponuz büyük olasılıkla denyNonFastforwards = trueyapılandırmasında bulunur. Bunu değiştirirsen git push --forceçalışmalısın.

Ayarı değiştirmek için, uzak depodan makineye erişmeniz gerekir. Oradan yap git config receive.denynonfastforwards false.


1
git configBir sunucu için yapabilir misin ? Ya da belki bunu mecazi olarak kullanıyordunuz. Bu fikirlerle oynamak için /opt/git(git sunucu alanımda) bir test deposu oluşturdum ve sonra bu ayarı içinde değiştirdim /opt/git/the_repo/the_repo.git/config. Ama bir kez git push --force origin SHA:branchgerektiği gibi çalıştı.
HankCa

4
Hata mesajında ​​"hata: bazı referansları <deponuza> gönderilemedi" ile başlayan bir satır olacaktır; burada <deponuz> .git ile biten ve "config" adlı bir dosya içeren bir dizindir. Bu "yapılandırma" dosyası, denyNonFastforwards = false
emery

1
@ emery'nin yorumu değerlidir. Bazen sunucudaki klasörün kaynağı /srv/git/repo.git gibi bir şeye ayarlanır. Bu, uygulama klasörü değil, denyNonFastForwards ayarlı yapılandırmadır.
Elijah Lynn

1
@hsalimi Sunucuya erişiminiz yoksa, sunucu yöneticisine başvurmanız ve onları geçici olarak kapatmanız gerekir, böylece zorla zorlayabilir ve ardından tekrar açabilirsiniz. Pek çoğunun bunu yapabilecek durumda olması pek olası değildir. Kendi barındırma ekibinizle iç ortamda daha yaygın olabilir.
Elijah Lynn

1
Bu başlangıçta sinir bozucu, ancak bunun güzelliği şudur: uzaktan kumanda varsayılan olarak tamamen korunur ve geliştirici olarak kasıtlı ve doğru bir şekilde geri ödemeler yapıyorsanız, tehlikeli davranışa izin vermek için bu yapılandırmayı geçersiz kılabilirsiniz. Yeniden adlandırma, her git kullanıcısının nasıl yapılacağını ve ne zaman yapılmayacağını bilmesi gereken bir şey. doc1 doc2
moodboom

15

Uzaktan kumanda hızlı olmayan ilerlemeye izin vermez.

En iyi seçeneğiniz, orada git revertolmaması gereken tüm taahhütler için ve gelecekte daha dikkatli olmaktır .

git revert [commit]ne [commit]yaptıysa onu geri alan yeni bir taahhüt yaratacaktır .


Uzak depodaki tüm hızlı ileri olmayan değişiklikleri engelleyen bazı ayarlardı.
samwell

Bunu yaparsanız ve yeniden uygulamanız gerekiyorsa, geçmiş yalnızca kod değişikliklerini geri almak için kaldırılmaz ve
kaydetmeleri

12

-fBayrağı kullanmayı ve uzak şube adının arkasına koymayı deneyin .

git push origin master -f


1
Hayır, bu da işe yaramadı. Ben de denedim git push -f origin masterve aynı sonucu. Her iki kez denedim, hata mesajının ikinci versiyonunu aldım.
samwell

12

Aşağıdaki tarzda zorlamayı kalıcı olarak etkinleştirmek için adımlar

git push -f myrepo my-branch

Uzak deponuzda ".git" ile biten klasördeki "config" adlı dosyayı düzenleyin

Git'in başarısız basmadan gelen komut satırı çıktısında, aşağıdaki gibi bir şey söyleyen satırı arayın:

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

sonra

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

"DenyNonFastforwards" öğesini yanlış olarak ayarlayın

"Config" de, ayarlayın

[receive]
        denyNonFastforwards = false

Artık yerel makinenizden -f ile itebilirsiniz.

git push -f myrepo my-branch

Çıplak git deposuna SSH'ye erişim olmadan bunu nasıl yapabilirim?
Vladimir Vukanac

Richo'nun önerdiği gibi belki git revert komutunu kullanın? Önce deponun mevcut durumunu yedeklerseniz, ileriye doğru kodunuzu yine de birleştirebilirsiniz.
emery

git revertbirleşmeleriniz olduğunda biraz karmaşıktır. Daha karmaşık olmak gerekirse, benim durumumda 3 birleştirme var, bunlardan biri çok eski ~ 20 commit ile geliştirmeden saptı, ikincisi ustadan bir çeşit birleşme - cehennem kadar çirkin.
Vladimir Vukanac

1
Belki de çözüm, istenen duruma sıfırlamak, yedeklemek (saklamak), tekrar çekmek ve yedeklemeyi (saklamak) uygulamaktır.
Vladimir Vukanac

1
mrW, geri alınmış / çekilmiş bir kod tabanının üzerine istediğiniz kod tabanını hala birleştirebilirsiniz
emery

2

Hızlı ileri sarılmayan git push yapmanıza izin verilmez.

  1. Uzak GitHub ise, https://github.com/$USER/$REPO/settings/branchessöz konusu şubeye gidin ve korumayı kaldırın .

    görüntü açıklamasını buraya girin

    Bunu yapmak için deponun yöneticisi olmanız gerekir.

  2. Uzaktan kumanda kendi git sunucunuzsa, git config receive.denynonfastforwards falseorada çalıştırın .


Git Hub Enterprise örnekleri için, varsayılan şubeye (genellikle "ana") göndermelerin örnek düzeyinde devre dışı bırakılabileceğini unutmayın. Bu, "yönetici" korumalı olmasa bile ve site yöneticisi olsanız bile, varsayılan şubeye zorla itme yapamayacağınız anlamına gelir. İzinlere sahip olduğunuzu varsayarsak, varsayılan dalı başka bir şeye değiştirerek, zorla itmenizi yaparak ve ardından geri dönerek geçici olarak bunun üstesinden gelebilirsiniz.
Christopher Hunter

2

Bunu aşmanın en iyi yolu, uzak dalı silip yeniden göndermektir:

git push origin master --delete
git push origin master

0

Mevcut dal, PULL için doğru şekilde yapılandırılmadığından sorun oluşur . Öncelikle, yukarı akış dalının çekme için doğru şekilde yapılandırılıp yapılandırılmadığını kontrol edin - git remote show origin. Sen bölümünde bulabilirsiniz - 'git çekme' için yapılandırılmış Yerel şube: . Değilse, şunu kullanarak yapılandırın:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

Yer tutucuya uygun şube adını verin - MYBRANCH


0

Uzak depomu sıfırlamak için bu komut grubunu kullanıyorum, bu yerel deponuzu yeniden başlatacak ve uzak deponuzla yeniden bağlantı kuracak ve ardından güncellemeleri zorlayacaktır.

Sanırım bu yol senin durumunda işe yaramayacak, ama başkası için faydalı olabilir

kaynak klasöre gidin ve ardından komutları çalıştırın: not, https://github.com/*.gituzak repo bağlantınızdır

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**


0

Benim için @svick'in ipucu doğru yönü gösteriyor. Değiştirmek istediğim git sunucusu aslında benim kutum olduğundan, ona giriş yaptım ve git config --global receive.denynonfastforwards falsetüm depoları ff olmayan zorunlu bir itmeyi kabul edecek şekilde değiştirdim. Kutunun dışında işe yaramadı. Bulduğum şey, yapılandırmada zaten receive.denynonfastforwards=trueayarlanmış olduğuydu ve silinemiyordu git config --global --unset receive.denynonfastforwards. Depodaki düzenlemeyi elle yapmak ( vi config) işe yaradı.


0

Ana dalı korumalı ve aynı zamanda bir depo ayarlamada aşırı korumalı şube kuralları olan varsayılandan kaldırarak çözdü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.