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:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

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


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ć.


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


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 git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org: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 git@server-address.org:account-name/repo-name.git


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.


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.


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>

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
    

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

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

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.


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.


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.




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.


1

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


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.