Dlaczego nie mogę naciskać na to puste repozytorium?

283

Czy możesz wyjaśnić, co jest nie tak z tym przepływem pracy?

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

Nie git pushzawsze wypycha do repozytorium, z którego sklonowałem?

ripper234
źródło
Nie powinieneś określać gałęzi do wypychania?
Rekin
3
nie po klonie !!! po rozwiązaniu problemu działa świetnie i nie trzeba określać gałęzi ... to właśnie przy pierwszej kasie pustego repozytorium ma to miejsce BARDZO BARDZO denerwujące ... powinni naprawić ten problem.
Dean Hiller
Mam nadzieję, że ten post przyda się komuś, kto spróbuje zrobić powyższe- samranga.blogspot.com/2015/07/ ... Błąd w pytaniu może zostać wyskakujący nawet podczas próby utworzenia repozytorium git BitBucket z już istniejącego projektu lokalnego
Samitha Chathuranga,

Odpowiedzi:

483

Tak, problem polega na tym, że nie ma żadnych zatwierdzeń w „goły”. Jest to problem tylko z pierwszym zatwierdzeniem, jeśli tworzysz repo w kolejności (goły, alicja). Spróbuj zrobić:

git push --set-upstream origin master

Byłoby to wymagane tylko za pierwszym razem. Potem powinno działać normalnie.

Jak zauważył Chris Johnsen, nie miałbyś tego problemu, gdyby Twój push.default został dostosowany. Lubię upstream / tracking.

Seth Robertson
źródło
1
Robię sudo apt-get upgrade git-corei sudo apt-get upgrade gitwydaje mi się, że żadna aktualizacja nie jest konieczna. git --versionzwraca 1.7.3.1. Masz pojęcie, czego brakuje? Przyznaję, że obecnie apt-get updatenie działa dla mnie, ale nie tak dawno temu.
ripper234
1
@ ripper234: Obecna wersja git to 1.7.5.3 Możesz albo żyć z tą niedogodnością, użyć innego przepływu pracy, albo zainstalować najnowszą wersję git ręcznie bez pakietu debian / ubuntu.
Seth Robertson
Ach, prawda, zapominam, że oprogramowanie zajmuje trochę czasu, zanim zostanie spakowane. Jestem linux noob, pochodzę z systemu Windows i przyzwyczaiłem się kliknąć tutaj, aby zainstalować najnowszą wersję.
ripper234
9
W odniesieniu do „Najnowsza wersja nie ma tego problemu”: Nawet w najnowszych wersjach domyślna wartość wypychania nie zmieniła się matching; może push.defaultustawiłeś upstream/ tracking(lub current) w swoim ~/.gitconfig?
Chris Johnsen
4
Spróbuj git push origin master:masterwyrazić to jasno. Jeśli to nie zadziała, sprawdź, na jakiej gałęzi jesteś: git branchbyć może nie dokonałeś pierwszego zatwierdzenia lub dokonałeś tego w gałęzi innej niż master.
Seth Robertson
43

Jeśli ty:

 git push origin master

przejdzie do samego repozytorium.

Wygląda na to, że Twoje repozytorium Alice nie śledzi poprawnie.

cat .git/config

Spowoduje to wyświetlenie domyślnego pilota i gałęzi.

Jeśli ty

 git push -u origin master

Powinieneś zacząć śledzić tego pilota i gałąź. Nie jestem pewien, czy ta opcja zawsze była dostępna.

serby
źródło
30

Odpowiedzi na to pytanie stanowiły dla mnie rozwiązanie ... to był tylko głupi błąd:

Pamiętaj, aby dokonać pierwszego!

https://stackoverflow.com/a/7572252

Jeśli jeszcze nie zaangażowałeś się w lokalne repozytorium, nie masz nic do przekazania, ale komunikat o błędzie Git, który otrzymasz, nie pomaga ci zbytnio.

phpguru
źródło
17
git push --all

to kanoniczny sposób na przeniesienie wszystkiego do nowego pustego repozytorium.

Innym sposobem na zrobienie tego samego jest utworzenie nowego, nie nagiego repozytorium, a następnie utworzenie go bez klonowania

git clone --bare

następnie użyj

git remote add origin <new-remote-repo>

w oryginalnym (nie nagim) repozytorium.

ebneter
źródło
... więc zanegowałeś odpowiedź? Jest to standardowy sposób na przeniesienie wszystkiego do nowego, czystego repozytorium. Jeśli to nie zadziałało, istnieje inny problem.
ebneter
Masz rację, prawdopodobnie nie powinienem, wiem, że próbowałaś tylko pomóc. Jeśli go edytujesz, cofam moje głosowanie.
ripper234
Dzięki, edytowałem to w inny sposób, aby wykonać to samo zadanie.
ebneter
Twoja odpowiedź pomogła mi dzięki;) Ale na końcu polecenia ścieżka musi być taka: git push --all ../test_repoadres URL repozytorium na końcu polecenia;)
Metafaniel
@Metafaniel To zależy od tego, jak to skonfigurowałeś. Jeśli Twoje lokalne repozytorium ma już poprawnie skonfigurowanego pilota, „git push --all” powinno działać tak, jak jest.
ebneter
7

Wypróbuj to w swoim alicerepozytorium (przed wypchnięciem):

git config push.default tracking

Lub skonfiguruj go jako domyślny dla swojego użytkownika za pomocą git config --global ….


git pushdomyślnie robi originrepozytorium (które zwykle jest repozytorium, z którego sklonowano bieżące repozytorium), ale nie domyślnie wypycha bieżącą gałąź - domyślnie wypycha tylko gałęzie, które istnieją zarówno w repozytorium źródłowym, jak i docelowym.

push.defaultZmiennej konfiguracji (patrz git-config (1) ) kontrole co git pushbędzie apelować, gdy nie podano żadnych argumentów „refspec” (czyli coś po repozytorium nazwa). Wartość domyślna określa zachowanie opisane powyżej.

Oto możliwe wartości push.default:

  • nothing
    To zmusza cię do dostarczenia „refspec”.

  • matching(domyślnie)
    Wypycha wszystkie gałęzie, które istnieją zarówno w repozytorium źródłowym, jak i docelowym.
    Jest to całkowicie niezależne od oddziału, który jest obecnie wyewidencjonowany.

  • upstreamlub tracking
    (Obie wartości oznaczają to samo. Później było przestarzałe, aby uniknąć pomyłek z gałęziami „zdalnego śledzenia”. Ta pierwsza została wprowadzona w 1.7.4.2, więc będziesz musiał użyć tej drugiej, jeśli używasz Git 1.7.3.1. )
    Wypychają bieżącą gałąź do gałęzi określonej przez jej konfigurację „upstream”.

  • current
    To wypycha bieżącą gałąź do gałęzi o tej samej nazwie w docelowym repozytorium.

    Te dwa ostatnie kończą się tak samo dla typowych przypadków (np. Praca na lokalnym systemie głównym, który używa źródła / wzorca jako swojego źródła ), ale różnią się, gdy oddział lokalny ma inną nazwę niż jego oddział „powyżej”:

    git checkout master
    # hack, commit, hack, commit
    
    # bug report comes in, we want a fix on master without the above commits
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    Z push.defaultrówną upstream(lub tracking), push pójdzie do origin„s głównego oddziału. Gdy jest ona równa current, push pójdzie do origin„s quickfix oddział.

matchingUstawienie zaktualizuje bare„s mistrza w swoim scenariuszu, gdy zostały ustalone. Aby to ustalić, możesz użyć git push origin masterraz.

Jednak upstreamustawienie (a może current) wydaje się, że może być lepiej dopasowane do tego, czego oczekujesz, więc możesz spróbować:

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push

# configure it for only this repository
git config push.default upstream

# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(Ponownie, jeśli nadal używasz Git przed 1.7.4.2, będziesz musiał użyć trackingzamiast upstream).

Chris Johnsen
źródło
1

Korzystam z klienta git SourceTree i widzę, że ich początkowa komenda commit / push to:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
Igor Ganapolski
źródło