2016-10-26 7 views
0

я создал местное отделение 12345 от происхождения/мастеров, что отношение к Герритукак найти удаленный филиал местного отделения

Как я могу найти имя удаленных реф/для/мастеров для местного отделения 12345

вход название ветви ссылки/главы/12345 или часть строки

Я подсчитал, что филиал наименование:

public String getCurrentBranch() throws GitException { 
     try { 
      Ref headRef; 
      headRef = repository.getRef(Constants.HEAD); 
      return Repository.shortenRefName(headRef.getLeaf().getName()); 
     } catch (IOException e) { 
      throw new GitException(e.getMessage(), e); 
     } 
    } 

Как я могу найти результат удаленного исх s/for/master для res/heads/12345?

Нужно ли это делать из конфигурации?

+0

Боюсь, я не понимаю, каков должен быть желаемый результат, можете ли вы более четко перефразировать свой вопрос? –

ответ

1

Вы кросс-меченый это и как и (а затем также , который, кажется, совершенно неуместно здесь, но я оставлю это для других), и я могу дать pure- ответ только, который может быть бесполезным.

В Git филиал-я имею в виду имени филиала , не structure -можно не более одного вверх по течению набора. Когда ветка имеет восходящий набор, ветвь называется дорожка вверх по течению. Этот восходящий поток обычно является именем филиала удаленного отслеживания, например, master может отслеживать origin/master. Название origin/master является удаленной отслеживающей ветвью, поэтому мы говорим, что «ветвь master отслеживает ветку удаленной отслеживания origin/master»: у этого слишком много вхождений слов «ветвь» и «дорожки», каждый с другим смыслом, но мы как бы застряли в этом.

Ветвь, которая отслеживает другую ветвь, не должна отслеживать (то есть иметь восходящий поток) ветвь удаленного отслеживания. Например, местное отделение feature/zorg может отслеживать местное отделение develop. Единственное, что наличие вверх по течению делает для вас автоматизировать больше fetch, merge и rebase (и, следовательно, pull который только fetch следуют одной из двух других), и даст вам больше информации при работе git branch -v (или -vv, и т. д.) и git status. Конечно, они довольно значительны и, следовательно, являются причиной для установки вверх по течению.

вверх -The название другой ветви, что данная ветвь следящая-устанавливается на две части: а дистанционного, который является имя удаленного, если вверх по течению является удаленным отслеживания ветви, и филиал (имя). Если пульт установлен на ., ветка отслеживает другую локальную ветвь.

Эти две части могут быть получены по отдельности с git config или git config --get (оба делают то же самое):

$ git config --get branch.master.remote 
origin 
$ git config --get branch.master.merge 
refs/heads/master 

Обратите внимание, что вторая часть не претерпела отображение (ы), указанный fetch правилом для данный пульт:

$ git config --get-all remote.origin.fetch 
+refs/heads/*:refs/remotes/origin/* 

С этого отображением говорит, что refs/heads/* становится refs/remotes/origin/*, мы можем определить, что нашего имени-го e, который соответствует refs/heads/master на удаленном origin Фактически refs/remotes/origin/master. (Конечно, это сопоставление довольно стандартное, и некоторое программное обеспечение может просто предположить это, но лучше всего на самом деле сделать сопоставление с использованием настроек (-ов) для remotes.origin.fetch. Может быть более одного, следовательно, здесь --get-all.)

Опять же, если часть remote установлена ​​в ., то восходящий поток фактически является локальной ветвью, и никакое сопоставление не должно применяться к части merge.

В сценарии оболочки, то вы могли бы сделать что-то вроде:

branch="${1:-master}" 
has_upstream=true 
remote="$(git config --get branch.$branch.remote)" || has_upstream=false 
merge="$(git config --get branch.$branch.merge)" || has_upstream=false 
if ! $has_upstream; then 
    echo "branch $branch has no upstream" 
else 
    case "$remote" in 
     .) echo "branch $branch tracks local branch $merge";; 
     *) echo "branch $branch tracks $merge on $remote";; 
    esac 
fi 

Это не поможет с отображением, если вы хотите, чтобы проверить пульт слежения ветвь (возможно, конечно, нужно запустить git fetch обновить его), но вы можете получить , что с помощью git rev-parse:

$ git rev-parse --symbolic-full-name [email protected]{u} 
refs/remotes/origin/master 

Обратите внимание, что вам нужно, чтобы лишить refs/remotes/ от результата, когда это удаленного отслеживания филиала, если вы хотите использовать короткую форму. Конечно, если восходящий поток является локальным филиалом, полное имя начинается с refs/heads/, а не refs/remotes/. Если вы хотите, чтобы текущая ветка была направлена ​​вверх, достаточно простого @{u}; синтаксис name@{u} позволяет находить имена других филиалов.

Суффикс @{u} делает rev-parse потерпеть неудачу, если не настроен на входе:

$ git rev-parse --symbolic-full-name [email protected]{u} 
fatal: no upstream configured for branch 'target' 

который предлагает еще один способ сказать, если вышестоящий сконфигурирован.