«origin / master» не обновляется после «git push origin» (когда используется скрипт) - PullRequest
0 голосов
/ 25 сентября 2019

При выполнении «git push origin» со сценарием Bash (где указаны имя пользователя и пароль) «origin / master» не обновляется, и при выполнении git status будет отображаться

 "Your branch is ahead of 'origin/origin' by 2 commits.

.без сценария (без указания имени пользователя и пароля) origin/origin обновляется очень хорошо.

Я сузил проблему до способа, которым я предварительно выполняю push, по какой-то причине предоставив имя пользователя и пароль с URL-адресомпульт вызывает проблему.

#!/bin/bash

#save current working directory
current_dir=${PWD} 


read -r -p 'git commit message: ' comment  # prompt user for commit message
git add .                                  # track all files
git commit -m "${comment}"                 # commit with message


#git push origin master
git push http://username:password@git.url master

1 Ответ

0 голосов
/ 26 сентября 2019

Ваш скрипт не выполняет git push origin, а скорее git push <url>:

#git push origin master
git push http://username:password@git.url master

То есть вы указали URL, а не имя origin,Так что, если пуш успешен, Git не знает, что он должен обновить свой собственный origin/master.

. Вы можете сделать любое из них:

  • использовать git push origin master (закомментированострока)
    • возможно, также установив url или pushurl, постоянно или временно
  • , следуя git push имени на основе URL с помощьюgit fetch origin
  • принудительно обновите свое собственное origin/master

Помните, что origin/master - это имя, которое ваш Git устанавливает и обновляет, чтобыпомните, что их Git - тот, что в origin - как говорили, было его master:

  • Когда вы запускаете git fetch origin, вашGit вызывает их Git, спрашивает их Git о всех их ветвях, получает все новые коммиты и другие необходимые вам предметы и обновляет все ваши origin/* имена.
  • Когда вы запускаете git push origin master, ваш Git вызывает их Git, предлагает им любые ваши новые коммиты, которых у них нет (вместе с другими предметами, которые идут с этим), и просит их установить их master до последнего из коммитов, которые вы только что нажали.Они либо говорят ОК, я сделал это или Нет, я отказываюсь делать это.Если они говорят, что сделали это, ваш Git обновляет ваш origin/master, потому что ваш Git знает, что их Git просто установил для master.

Но в этом случае ваш Git didn ' позвоните в Git по номеру origin.Вместо этого он вызвал некоторый случайный Git-сервер на http://username:password@git.url. Что Git может обновлять или не обновлять master, но какие отношения у Git с origin?Насколько твой мерзавец знает, вообще ничего.Так что ваш Git не не обновляет ваш origin/master.

Чтобы ваш Git понял, что это тот же самый "другой Git", вы должны убедиться, что git push вызываетдругой Git под именем origin.Если вы не можете выполнить эту работу (но можете, см. Ниже), вы можете запустить git fetch origin, чтобы ваш Git забрал обновление, или использовать git update-ref (но не делайте этого).

Как предоставить URL-адрес навсегда или только для одной push операции

При запуске:

git push origin master

Git сначала пытается получить URL-адрес для push изрезультат:

git config --get remote.origin.pushurl

Если это ничего не находит, он пытается:

git config --get remote.origin.url

(который также предоставляет URL для git fetch).Этот должен преуспеть;если это не удается, вы не можете ни git fetch, ни git push вообще, используя имя origin.

Теперь, когда ваш Git имеет URL (с git config --get), ваш Git продолжает пытатьсявызвать другой Git.Конечно, это может быть успешным или неудачным.

Итак, чтобы навсегда установить URL для и git fetch и git push, вы можете изменить настройку remote.origin.url.Чтобы навсегда установить URL-адрес только для git push, оставив только один git fetch, можно установить или изменить параметр remote.origin.pushurl.Есть несколько разных способов сделать это;команда, предназначенная для пользователей командной строки, - это команда git remote:

git remote set-url --push origin http://username:password@git.url

, например, запишет заданный URL-адрес, основанный на имени пользователя и пароле, в .git/config с настройкой remote.origin.pushurl.Я предпочитаю запускать git config --edit и просто редактировать файл .git/config в моем редакторе, но вы можете использовать git remote set-url. Обратите внимание, что при этом ваш пароль будет записан в файл , который не является безопасным;но вы все равно уже сделали это в скрипте, так что на самом деле он не намного хуже, чем раньше.

В качестве альтернативы вы можете запустить:

git -c remote.origin.pushurl=http://username:password@git.url push origin master

в вашем скрипте.Опция -c, равная git, устанавливает один элемент конфигурации на время этой конкретной команды Git.Таким образом, это будет работать без сохранения имени пользователя и пароля в файле конфигурации Git (хотя, как и раньше, они по-прежнему сохраняются в открытом тексте в вашем скрипте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...