Возможно ли создать ветку, которая отслеживает несуществующий удаленный

#git #scripting #automation

#git #сценарии #автоматизация

Вопрос:

Я бы хотел оформить ветку таким образом, чтобы последующие git push правильно отправили ее в источник под тем же именем.

Это легко, когда удаленная ветка уже существует

 git checkout -b branch origin/branch
  

Тем не менее, я хотел бы сделать это, даже если origin/branch ее еще нет.

Ответ №1:

Просто создайте локальную ветку

 git checkout -b branch
  

Удаленный репозиторий ничего не знает о вашей локальной ветке, поэтому вы должны запустить ее в первый раз «вручную»

 git push origin branch
  

Теперь, если вы хотите, чтобы ваш локальный репозиторий позволил ему отслеживать вашу локальную ветку с помощью удаленного

 git branch --set-upstream branch origin/branch
  

Комментарии:

1. Чего бы я хотел, так это избежать нажатия «вручную», так как я не хочу переделывать свои скрипты 😉

2. Это просто для создания удаленного аналога, и это требуется только один раз. После этого задайте восходящий поток (третья команда), у вас все должно быть в порядке.

3. То, что я пишу, является одноцелевой RC-веткой… но если это невозможно, это тоже ответ — спасибо.

4. «Создать удаленную ветку» (используя git push) может заставить это работать, но IMO это определенно НЕ отвечает на вопрос. Я хотел бы иметь возможность отслеживать несуществующую удаленную ветку (когда я инициализирую новый пустой проект).

5. @rektide Что вы хотите отслеживать, если оно не существует? Вы можете ссылаться только на существующие объекты. «Я хочу, чтобы мой стул выглядел как вон тот стул» — «Но там нет стула» 😕 — Честно говоря, я отвечаю на вопрос OPs, но не на ваш, потому что ваш отличается довольно простым ответом: вы не можете.

Ответ №2:

Простого способа нет, AFAIK.

Это моя текущая попытка. Это функция bash, которая настраивает новую локальную ветку таким образом, что git push из этой ветки выполняется переход к новой удаленной ветке с тем же именем.

 function featurebranch() {
  if [ "$@" != "" ]; then
    git branch "$@" origin/master
    git checkout "$@"
    git config branch."$@".remote origin
    git config branch."$@".merge refs/heads/"$@"
    git config branch."$@".rebase true
  fi
}
  

Она должна использовать git config , потому что при использовании команд git push -u или git branch --track или git branch --set-upstream-to все они связаны с удаленной веткой, которая действительно существует.

Я был бы признателен, если бы какие-либо git-гуру проверили это и указали на любые проблемы. Ta. 😉

Комментарии:

1. Мне это нравится, или, по крайней мере, идея этого. Проблемы (от не-git-master): (1) git-status сообщает, что восходящий поток удален, и предлагает выполнить сброс, (2) Я бы разрешил пользователю указать ветку from и сохранил бы ее как автономный исполняемый скрипт bash, чтобы его можно было назвать «git-featurebranch» и мне не нужно было путаться с псевдонимами. Я могу продолжить, как только протестирую свои моды

2. Грегори — Я разместил свои модификации к этому здесь: gist.github.com/nhed/239aa94078b0b533d6f5

3. Это должен быть одобренный ответ 🙂

Ответ №3:

Git 1.7.0

Во-первых, создать локальную ветку:

 git checkout -b new-branch
  

На данный момент удаленный репозиторий не знает о локальной ветке, поэтому нам нужно нажать на нее и установить ссылку для отслеживания.

 git push -u origin new-branch
  

 

Git < 1.7.0

Создайте локальную ветку:

 git checkout -b new-branch
  

Git до версии 1.7.0 требовались три команды для запуска ветки и установки ссылки для отслеживания.

 git push origin new-branch
git config branch.new-branch.remote origin
git config branch.new-branch.merge refs/heads/new-branch
  

 

С псевдонимом (Git 1.7.0 )

Бонус: создайте локальную ветку и отправьте отслеживаемую удаленную ветку одной командой с этим псевдонимом git:

 git config --global alias.cb $'!sh -c 'git checkout -b "$0" amp;amp; git push -u origin "$0"''
  

Затем, чтобы создать новую ветку, вы можете просто запустить:

 git cb new-branch
  

Комментарии:

1. Также можно использовать шаги, подробно описанные в git < 1.7.0 в более поздних версиях, чтобы создать ветку с настроенной отслеживающей веткой без выполнения сетевого запроса, который может быть тем, что искал OP. git push Последующее выполнение создаст удаленную ветку.

2. Моя настройка: cb = "!git checkout -b $1; git config branch.$1.remote origin; git config branch.$1.merge refs/heads/$1 #"

Ответ №4:

Проверено. версия git 2.10.1 (Apple Git-78)

 1) git checkout -b localBranchNameThatDoesNotExistInRemote

2) Do your changes , and go a git commit 

3) git push origin localBranchNameThatDoesNotExistInRemote --force
  

Примечание. — Поздний завтрак, на котором вы в данный момент находитесь, локальный, и удаленная несуществующая ветка, куда вы пытаетесь зайти, должны иметь одно и то же имя.