Git i paskudny „błąd: nie można zablokować istniejących informacji / odnośników krytycznych”

360

Po klonowaniu ze zdalnego repozytorium git (w lepszych kodach) dokonałem pewnych zmian, zatwierdziłem i próbowałem wypchnąć:

git push origin master

Błędy związane z:

błąd: nie można zablokować istniejących informacji / odnośników
krytycznych: błąd git-http-push nie powiódł się

Ten przypadek dotyczy już istniejącego repozytorium.

To, co robiłem wcześniej, to:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. zmienić dane
  6. git commit

W „bettercodes” nie mam dostępu do dziennika git.

Korzystam z systemu Windows. Szczegółowy błąd to:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:[email protected]/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Sklonowałem wcześniej, potem zmieniłem kod i zatwierdziłem.

AnnD
źródło
Bez powodzenia, znowu ten sam błąd.
AnnD
Dwa możliwe powody: a) Uruchomiona jest inna instancja git (zabij wszystkie procesy git lub uruchom ponownie) b) .git został utworzony jako Administrator (spróbuj wykonać wiersz poleceń administratora)
FractalSpace
Dla mnie rozwiązałem błąd, dzwoniąc git fetchwcześniej git pull.
Levi Fuller
1
Ten błąd jest paskudny
RobW

Odpowiedzi:

682

Dla mnie to zadziałało:

git remote prune origin

Ponieważ wydaje się, że ta odpowiedź pomaga wielu ludziom, wgłębiłem się nieco w to, co się tutaj naprawdę dzieje. Spowoduje to usunięcie odniesień do zdalnych gałęzi w folderze .git/refs/remotes/origin. Nie wpłynie to więc na oddziały lokalne i nie zmieni niczego zdalnego, ale zaktualizuje lokalne odwołania do oddziałów zdalnych. Wydaje się, że w niektórych przypadkach te odwołania mogą zawierać dane, których Git nie może poprawnie obsłużyć.

arno_v
źródło
1
Dodałem kilka podstawowych informacji, ale muszę szczerze powiedzieć, że nie wiem dokładnie, dlaczego i jak to działa :)
arno_v
1
git zdalne pochodzenie śliw działa dla mnie. Ale usunąłem wszystkie odniesienia w .git / refs / remotes / origin.
Isuru Madusanka
2
To właśnie gitsugeruje zrobienie tego, ale nie chciałem tego robić, ponieważ polecenie brzmi, jakby coś zrobiło z pilotem.
Wyrzuć konto
4
Pobiegłemgit gc --prune=now
Stanley Mohlala
9
To jest NAJWYŻSZA git cmd, którą uruchomiłem już jakiś czas. (PS: zadziałało)
Sat Thiru
456

Chcesz spróbować:

git gc --prune=now

Zobacz https://www.kernel.org/pub/software/scm/git/docs/git-gc.html

kiran.gilvaz
źródło
Czy --prune = teraz to samo co --prune = all? Jeśli tak, dokumentacja ostrzega, że ​​możesz stracić niezakotwiczone obiekty. Jeśli istnieją niezakotwiczone obiekty, prawdopodobnie powinieneś spróbować je pogodzić przed przycięciem.
Assaf Israel,
3
Oszczędzanie życia, dziękuję. git pullutknął z podobnym komunikatem o błędzie.
Phil Brubaker
4
Pomogło to przy pobieraniu wyjątku „błąd git: nie można zablokować odwołania”. Wielkie dzięki!
Alexander
9
To zadziałało dla mnie. Ale potem musiałem wykonywać to samo polecenie za każdym razem, gdy używam gitpolecenia dotyczącego zdalnego. git remote prune originraz na zawsze rozwiązało problem.
Keyur Golani
uratował mi dzień! Wielkie dzięki :)
Abhishek Gautam
188

Stało się tak, gdy mój git remote (bitbucket.org) zmienił adres IP. Szybka poprawka polegała na usunięciu i ponownym dodaniu pilota, a następnie wszystko działało zgodnie z oczekiwaniami. Jeśli nie wiesz, jak usunąć i ponownie dodać pilota w git, wykonaj następujące czynności:

  1. Skopiuj adres URL git SSH istniejącego pilota. Możesz wydrukować go na terminalu za pomocą tego polecenia:

    git remote -v

który wydrukuje coś takiego:

 origin [email protected]:account-name/repo-name.git (fetch)
 origin [email protected]:account-name/repo-name.git (push)
  1. Usuń pilota z lokalnego repozytorium git:

    git remote rm origin

  2. Dodaj pilota z powrotem do lokalnego repozytorium:

    git remote add origin [email protected]:account-name/repo-name.git

johnnyclem
źródło
8
Próbowałem już wszystkiego, takiego jak git gc, git prune, rm „plik z błędem blokady”, informacje o serwerze aktualizacji git itp. Tylko ta odpowiedź działała dla mnie. Czasami przypomina to ponowne uruchomienie systemu Windows, ponowne uruchomienie i będzie działać. To samo tutaj, po prostu usuń i dodaj repozytorium ponownie, a wszystko pójdzie dobrze;)
Marquinho Peli
12
Po powyższej procedurze musiałem również powiedzieć gitowi, aby ponownie wyśledził zdalną gałąź za pomocą np .:git branch -u origin/master
fotinsky
Spowodowało to uszkodzenie wszystkich moich danych zdalnego śledzenia w .git / config i tak naprawdę nie działało.
ThomasMcLeod
To również działało dla mnie. Wszystkie pozostałe nie działały.
dondrzzy,
42

Uruchomione polecenie git update-ref -d refs/heads/origin/branchnaprawiło to.

akansh tayal
źródło
4
Polecenie to również git update-ref -d refs/remotes/origin/my_branch
załatwiło sprawę
To działało dla mnie, wydaje się, że był to problem z rozróżnianiem wielkości liter. Były dwie gałęzie o tej samej nazwie, które zostały wypchnięte przez innego użytkownika git, jedna miała małe litery, a druga była tytułem.
th3uiguy,
24

Naprawiłem to, wykonując następujące czynności

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Zakładając, że lokalne i zdalne gałęzie są wyrównane, a błąd refs pojawia się jako niekrytyczny.

FrankMonza
źródło
12

Miałem ten problem, ponieważ byłem w oddziale, który miał podobną nazwę do oddziału. tzn. wezwano gałąź upstream example-branchi moja gałąź lokalna example-branch/backend. Rozwiązaniem była zmiana nazwy mojego lokalnego oddziału w następujący sposób:

git branch -m <new name goes here>
George Armstrong
źródło
11

Prawdopodobnie problem został już rozwiązany. Ale oto, co zadziałało dla mnie.

  1. Lokalizacja:

    • Jeśli zablokowane repozytorium znajduje się po stronie serwera:

      1. ssh do Twojego repozytorium git na serwerze.
      2. Zaloguj się jako użytkownik, który ma uprawnienia do modyfikowania repozytorium i przejdź do repozytorium na serwerze.
    • Jeśli zablokowane repozytorium jest tylko lokalne:

      1. Otwórz konsolę git i przejdź do katalogu repozytorium.
      2. Uruchom to polecenie:

        git update-server-info
        
  2. W razie potrzeby napraw uprawnienia w swoim (zdalnym lub / i lokalnym) repozytorium. W moim przypadku musiałem chmodsię 777i chowndoapache:apache

  3. Spróbuj wypchnąć ponownie z lokalnego repozytorium:

    git push
    
WolfTail
źródło
10

Dla mnie zadziałało:

  1. Usunąć .git/logs/refs/remotes/origin/branch
  2. Usunąć .git/refs/remotes/origin/branch
  3. Biegać git gc --prune=now
emirc
źródło
1
Działa jak urok. Jeśli ktoś ma problem z gałęzią nazwy pliku / folderu, to w rzeczywistości odnosi się do wszystkich plików / folderów nazwy gałęzi. Mam nadzieję, że to pomoże!
Ankit Kesharwani
7

Tak to dla mnie działa.

  1. wyszukaj plik blokady Apache DAV na serwerze (np. / var / lock / apache2 / DAVlock)
  2. Usuń to
  3. utwórz go ponownie z uprawnieniami do zapisu dla serwera WWW
  4. zrestartuj serwer WWW

Jeszcze szybsza alternatywa:

  1. wyszukaj plik blokady Apache DAV na serwerze (np. / var / lock / apache2 / DAVlock)
  2. Opróżnij plik: cat /dev/null > /var/lock/apache2/DAVlock
  3. zrestartuj serwer WWW
schmunk
źródło
To był mój problem. Dzięki za post. Uruchomiłem usuwanie i uprawnienia w jednym ujęciu. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely
6

To brzmi jak problem z uprawnieniami - czy to możliwe, że masz otwarte dwa okna, uruchamiane z osobnymi prawami? Być może sprawdź własność folderu .git.

Być może sprawdź, czy jest otwarta zaległa blokada pliku, może użyj lsof, aby sprawdzić, lub odpowiednika dla twojego systemu operacyjnego.

Josh
źródło
3

W moim przypadku gałąź została przeniesiona do podkatalogu, a katalog został nazwany jako gałąź. Git był tym zmieszany. Kiedy usunąłem lokalny oddział (w SourceTree tylko prawym przyciskiem myszy usuń) wszystko działało jak zwykle.

CodingYourLife
źródło
3

W moim przypadku po otrzymaniu tej wiadomości wykonałem polecenie kasy i otrzymałem tę wiadomość:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Po uruchomieniu tego polecenia wróciłem do normy.

Colin
źródło
2

Aktualizacja:

Może być konieczna edycja pliku ~ / .netrc:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

Oryginalna odpowiedź:

Dlaczego wyłączyłeś ssl? Myślę, że może to mieć związek z tym, że nie możesz przesyłać danych przez https. Odłożyłbym to z powrotem i spróbowałem ponownie:

git config –global http.sslVerify true
ralphtheninja
źródło
1

Sprawdź, czy masz (proces git) dostęp do pliku .git/info/refsi czy ten plik nie jest zablokowany przez inny proces.

Iwan Daniłow
źródło
2
Jak to sprawdzasz?
Iulian Onofrei
1

Miałem ten problem, kiedy próbowałem utworzyć nową gałąź funkcji, która zawierała nazwę starej gałęzi, np. Origin - gałąź1 i chciałem utworzyć funkcję gałąź1. Nie było to możliwe, ale funkcja branch1 / już była.

użytkownik11464384
źródło
1

W moim przypadku musiałem ręcznie usunąć stare tagi, które zostały usunięte zdalnie.

Joliejuly
źródło
1

W moim przypadku było to związane z nazwą oddziału, którą już utworzyłem.

Aby rozwiązać ten problem, utworzyłem gałąź o nazwie, która z pewnością nie powinna istnieć, na przykład:

git checkout -b some_unknown_branch

Następnie wyczyściłem wszystkie inne gałęzie (nieaktywne), ponieważ były to niepotrzebne śmieci.

git branch | grep -v \* | grep -v master | xargs git branch -D

a następnie zmieniłem nazwę mojej obecnej gałęzi na nazwę, którą zamierzałem, na przykład:

git checkout -m my_desired_branch_name
Arsen Khachaturyan
źródło
0

W przypadku bettercodes.org rozwiązanie jest bardziej poetyckie - jedynym problemem mogą być prawa przypisane członkom projektu. Prosti członkowie nie mają prawa zapisu! Upewnij się, że masz uprawnienia moderatora lub administratora. Oczywiście administrator musi to ustawić na stronie bettercodes.org w ustawieniach projektu.

yman
źródło
0

Widziałem ten błąd podczas próby uruchomienia, git filter-branchaby odłączyć wiele podkatalogów do nowego, osobnego repozytorium (jak w tej odpowiedzi ).

Wypróbowałem wszystkie powyższe rozwiązania i żadne z nich nie działało. W końcu zdecydowałem, że nie muszę zachowywać wszystkich moich tagów w nowej gałęzi i po prostu uruchomiłem:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
tessafyi
źródło