Чому я не можу перейти до цього голого сховища?


283

Чи можете ви пояснити, що з цим робочим процесом не так?

$ 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'

Не git pushзавжди підштовхується до сховища, з якого я клонувався?


Чи не слід вказати гілку для натискання?
Рекін

3
не після клону !!! після виправлення проблеми вона працює чудово і немає необхідності вказувати гілку ... саме на цьому першому оформленні порожнього сховища це відбувається, що ДУЖЕ ДРУЖНО ... вони повинні вирішити цю проблему.
Дін Гіллер

Сподіваюся, ця публікація буде корисною для когось, коли намагається зробити вище- samranga.blogspot.com/2015/07/… Помилка питання може з’явитися навіть при спробі створити сховище git BitBucket з уже існуючого локального проекту
Samitha Чатуранга

Відповіді:


483

Так, проблема полягає в тому, що в "голому" немає жодних комісій. Це проблема лише з першим фіксацією, якщо ви створюєте репости в порядку (голо, аліса). Спробуйте зробити:

git push --set-upstream origin master

Це потрібно було б лише вперше. Після цього він повинен працювати нормально.

Як зазначав Кріс Джонсен, у вас не виникло б цієї проблеми, якби ваш push.default був налаштований. Мені подобається вгору / стеження.


1
Я це роблю, sudo apt-get upgrade git-coreі sudo apt-get upgrade gitвважаю, що оновлення не потрібно. git --versionповернення 1.7.3.1. Будь-яка ідея, чого не вистачає? Зізнаюся, наразі apt-get updateце не працює для мене, але це було не так давно.
ripper234

1
@ ripper234: Поточна версія git становить 1.7.5.3 Ви можете жити з незручностями, використовувати інший робочий процес або встановлювати останню git вручну без упаковки debian / ubuntu.
Сет Робертсон

Ага, я забуваю, що програмне забезпечення потребує певного часу, перш ніж воно буде розфасовано. Я нобус linux, що походить з Windows, і використовується для того, щоб натиснути тут, щоб встановити найновішу версію.
ripper234

9
Щодо "Остання версія не має цієї проблеми": Навіть в останніх версіях типовий режим для натискань, схоже, не змінився з matching; можливо, ви push.defaultвстановили upstream/ / trackingабо current) у своєму ~/.gitconfig?
Кріс Джонсен

4
Спробуйте git push origin master:masterзробити це явним. Якщо це не працює, перевірте, на якій гілці ви перебуваєте: git branchможливо, ви не зробили перше зобов’язання або ви зробили це на іншій гілці, ніж master.
Сет Робертсон

43

Якщо ти:

 git push origin master

це підштовхне до голого репо.

Здається, ваша аліпо-репо не відстежує правильно.

cat .git/config

Це покаже пульт за замовчуванням та відділення.

Якщо ти

 git push -u origin master

Ви повинні почати відстежувати цей віддалений та відділення. Я не впевнений, чи завжди цей варіант був у git.


30

Відповідь на цю відповідь на питання дала для мене рішення ... це була просто німа помилка:

Не забудьте зробити перше!

https://stackoverflow.com/a/7572252

Якщо ви ще не взяли на себе відповідальність за місцеве репо, не можна нічого натискати, але повідомлення про помилку Git, яке ви отримаєте назад, не дуже допоможе вам.


17
git push --all

це канонічний спосіб перенести все до нового голого сховища.

Ще один спосіб зробити те ж саме - створити своє нове, неоголене сховище, а потім зробити голий клон за допомогою

git clone --bare

потім використовуйте

git remote add origin <new-remote-repo>

в оригінальному (неоголеному) сховищі.


... значить, ти зняв відповідь? Це є стандартним способом , щоб підштовхнути всі на новий, голий репозиторій. Якщо це не спрацювало для вас, є ще якась проблема.
ebneter

Ви маєте рацію, я, мабуть, не повинен був, я знаю, що ви просто намагалися допомогти. Якщо ви відредагуєте це, я скасую свою анкету.
ripper234

Дякуємо, відредагували його іншим способом виконання того ж завдання.
ebneter

Ваша відповідь допомогла мені спасибі;) Але наприкінці команди шлях повинен бути таким: git push --all ../test_repoURL-адреса репо в кінці команди;)
Metafaniel

@Metafaniel Це залежить від способу налаштування. Якщо ваш локальний репо вже має належний налаштований пульт, "git push - all" має працювати так, як є.
ebneter

7

Спробуйте це у своєму aliceсховищі (перед натисканням):

git config push.default tracking

Або налаштуйте його за замовчуванням для користувача git config --global ….


git pushробить за замовчуванням originсховище (яке зазвичай є сховищем, з якого ви клонували поточне сховище), але воно не за замовчуванням натискає поточну гілку - вона за замовчуванням надає лише ті гілки, які існують і в вихідному сховищі, і в репозиторії призначення.

push.defaultЗмінної конфігурації (див ГИТ-конфігурації (1) ) управління , що git pushбуде штовхати , коли він не дав ніяких «refspec» аргументи (тобто що - то після імені сховища). Значення за замовчуванням дає поведінку, описану вище.

Ось можливі значення для push.default:

  • nothing
    Це змушує вас поставити “респект”.

  • matching(за замовчуванням)
    Це висуває всі гілки, що існують як у вихідному сховищі, так і у сховищі призначення.
    Це абсолютно незалежно від галузі, яку зараз перевіряють.

  • upstreamабо tracking
    (Обидва значення означають одне і те ж. Пізніше було застаріло, щоб уникнути плутанини з гілками "дистанційного відстеження". Перше було введено в 1.7.4.2, тому вам доведеться використовувати останнє, якщо ви використовуєте Git 1.7.3.1. )
    Вони підштовхують поточну гілку до гілки, визначеної її “upstream” конфігурацією.

  • current
    Це підштовхує поточну гілку до однойменної гілки в сховищі призначення.

    Ці останні два в кінцевому підсумку однакові для звичайних випадків (наприклад, робота над локальним господарем, який використовує походження / master як вихідний потік), але вони відрізняються, коли місцева гілка має іншу назву від своєї гілки "вище за течією":

    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
    

    З push.defaultрівним upstream(або tracking), поштовх буде йти в origin«s основний гілки. Коли воно дорівнює current, що штовхає б до origin«s QuickFix філія.

matchingУстановка оновить bare«s майстер в вашому сценарії , коли він був створений. Щоб встановити його, ви могли використовувати git push origin masterодин раз.

Однак upstreamналаштування (а може бути current) здається, що це може бути краще відповідати тому, що ви очікуєте, що відбудеться, тому ви можете спробувати:

# 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

(Знову ж таки, якщо ви все ще використовуєте Git до 1.7.4.2, вам потрібно буде використовувати trackingзамість upstream).


1

Я використовую SourceTree git-клієнт, і я бачу, що їх початковою командою фіксація / push є:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.