Mam repozytorium git ze zdalnym origin
dublowane na 3 hosty.Git: - force-with-lease i wiele pushurls
$ git remote -v
origin [email protected]:username/repo.git (fetch)
origin [email protected]:username/repo.git (push)
origin [email protected]:username/repo.git (push)
origin [email protected]:username/repo.git (push)
Wszystko, wszędzie jest popełnić .
$ git rev-parse HEAD
A
$ cat .git/refs/remotes/origin/master
A
I autor popełnić B i przesunąć go. Teraz wszyscy są zatwierdzeni B.
$ git push origin master
To github.com:username/repo.git
A...B master -> master
To gitlab.com:username/repo.git
A...B master -> master
To bitbucket.org:username/repo.git
A...B master -> master
$ git rev-parse HEAD
B
$ cat .git/refs/remotes/origin/master
B
Teraz zauważam błąd w tym ostatnim zatwierdzeniu, więc naprawiam go i ammend commit. To sprawia, że nie jestem zsynchronizowany z pilotem (ami).
$ git rev-parse HEAD
C
$ cat .git/refs/remotes/origin/master
B
chciałbym uniknąć ślepo --force
popychanie, więc używam --force-with-lease
, ale to się nie powiedzie w ciekawy sposób.
$ git push --force-with-lease origin master
To github.com:username/repo.git
+ B...C master -> master (forced update)
To gitlab.com:username/repo.git
! [rejected] master -> master (stale info)
To bitbucket.org:username/repo.git
! [rejected] master -> master (stale info)
Problem polega na tym, --force-with-lease
będzie brać pod uwagę tylko jeśli push bezpieczny zdalny sędzią jest przy tym popełnić jak ostatnim razem I przekazywane z niego, a moje lokalne rekordy SHA1 tego popełnić w .git/refs/remotes/origin/master
. Gdy tylko zostanie zaktualizowane pierwsze lustro (GitHub), git aktualizuje zdalny lokalny plik referencyjny GitHub, aby zatwierdzić C, powodując, że próby wypychania GitLab i Bitbucket zakończyły się niepowodzeniem, ponieważ oczekujemy teraz, że będą one zatwierdzane jako C.
Chcę to zrozumieć, więc najpierw zmuszam lustro GitHub do zatwierdzenia B.
$ git push origin +B:refs/heads/master
To github.com:username/repo.git
+ C...B B -> master (forced update)
Everything up-to-date
Everything up-to-date
Teraz muszę być bardziej szczegółowy o tym, którego zatwierdzenia oczekuję od pilotów. Dokumentacja mówi, że możesz dokładnie określić, które odnowienie chcesz zaktualizować, i jakiego zatwierdzenia oczekujesz obecnie z --force-with-lease=<refname>:<expect>
, więc próbuję tego.
$ git push --force-with-lease=origin/master:B origin master
To github.com:username/repo.git
! [rejected] master -> master (non-fast-forward)
To gitlab.com:username/repo.git
! [rejected] master -> master (non-fast-forward)
To bitbucket.org:username/repo.git
! [rejected] master -> master (non-fast-forward)
Najwyraźniej robię coś nie tak. Może mam niewłaściwy kod <refname>
? Czuję, że jestem tak blisko. czego mi brakuje?
Interesujący test do wypróbowania: 'git push --force-with-lease = $ (git rev-parse origin/master): B origin master' (tzn. Surowy identyfikator zatwierdzenia zamiast nazwy). Nie jestem pewien, kiedy Git zmienia nazwę na tłumaczenie ID dla tego konkretnego przypadku krawędzi. – torek
@torek To było warte strzału, ale bez kości. Zrobiło to samo (wszystkie wypychania odrzucone jako "non-fast-forward"). – ivan
Interesujące. Po prostu zgaduję (kod jest dość kręty), ale podejrzewam, że opcja force-with-lease zapominała gdzieś podczas wielu adresów URL. Założę się, że działa znacznie lepiej, jeśli masz tylko jeden pilot dla każdego adresu URL. – torek