2015-08-12 1 views
5

git checkout -b <name> <remote>/<branch> wydaje się wymagać nazwanego pilota. Czy istnieje sposób, aby zadziałał, mając tylko adres URL? Powodem jest to, że ludzie w zespole mają różne nazwy dla pilotów (np. gitlab i origin kontra origin i github), a ja chciałbym zignorować tę różnicę w skrypcie.Czy zdalny adres URL zamiast nazwy może być używany do odszukiwania oddziałów?

Jedną z możliwości jest nadanie nazwy pilotowi na początku skryptu i usunięcie jej na końcu, ale wolałbym tego uniknąć.

+2

Jeśli nazwa oddziału jest wyjątkowy, można pominąć '' całkowicie. –

+1

Może zespół powinien przyjąć pewne standardowe konwencje nazewnictwa. – larsks

Odpowiedz

3

Nie ma żadnego sposobu, aby drugi parametr adresu git checkout -b działał z adresem URL w przeciwieństwie do nazwy oddziału (w postaci <remote>/<branch> lub innej).

Od strony man:

git checkout -b|-B <new_branch> [<start point>] 
     Specifying -b causes a new branch to be created as if git-branch(1) were 
     called and then checked out. In this case you can use the --track or 
     --no-track options, which will be passed to git branch. As a convenience, 
     --track without -b implies branch creation; see the description of 
     --track below. 

     If -B is given, <new_branch> is created if it doesn’t exist; otherwise, 
     it is reset. This is the transactional equivalent of 

      $ git branch -f <branch> [<start point>] 
      $ git checkout <branch> 

     that is to say, the branch is not reset/created unless "git checkout" is 
     successful. 

Drugim parametrem git branch dalej start point musi być coś, co wskazuje na popełnić w istniejącym repo. Odgałęzienie (które prawdopodobnie nie jest nawet pobierane) adresowane za pomocą adresu URL tego nie osiągnie. Co więcej, nie ma sposobu na zakodowanie gałęzi do adresu URL git w standardzie (github może mieć coś, ale myślę, że nie, w przeciwnym razie import golangu byłby dużo łatwiejszy).

Jeśli chcesz, aby to działało, trzeba będzie:

  • Przetwarza wyjście git remote -v show aby uzyskać odpowiednią nazwę zdalnego
  • Wykonuje git fetch celu zapewnienia właściwego oddziału jest rozebrany (git fetch --all jest chyba twoim przyjacielem)
  • Dołącz nazwę oddziału do nazwy zdalnej i git checkout -b tha t.

Oto bardzo lekko przetestowany skrypt bash:

#!/bin/bash 
# 
# usage: scriptname repo branchname 
# 
# where repo is the URL, branchname is the branchname to create 
repo="$1" 
branchname="$2" 
remote=$(git remote -v show | perl -n -e 'if (m,^(\w+)\s+(\S+)\b, && $2 eq '"'${repo}'"') {print "$1\n" ; exit 0}') 
if [ "$remote" == "" ] ; then 
    echo cannot find "${repo}" 1>&2 
    exit 1 
fi 
git fetch --all && git checkout -b "${branchname}" "remotes/${remote}/${branchname}" 
2

Running git remote w korzeniu repo na przykład daje coś takiego:

$ git remote 
foobar 
origin 

Można analizować i że włączenie go w skrypcie.

+0

Dobry pomysł, ale ogólnikowa odpowiedź. Nie wyjaśnia, w jaki sposób można wywnioskować nazwę zdalnego adresu URL. –

2

Jedną z możliwości (jak sugerują inni) znajduje się nazwisko pilota biorąc pod uwagę jego URL

[email protected]:foo/bar.git 
REMOTE_NAME=git remote -v show | grep $REMOTE_URL | awk '{print $1}' 
git checkout -b <name> $REMOTE_NAME/<branch> 

Ponadto, jeśli” na szczęście mieć unikalną nazwę dla oddziału, można po prostu zrobić

git checkout -b <name> <branch> 

i git będą automatycznie wybierać pilota zawierający tę gałąź.

+0

... chyba że Twój URL zawiera znaki wyrażenia regularnego. 'Grep -F' byłoby lepsze. Prześledziłem to w "perl". – abligh

+0

@bligh, punkt fair. Jest to bardziej koncepcja, rzeczywiste przetwarzanie może być bardziej trwałe w zależności od przypadku użycia. –

1

Można to zrobić, ale nie za pomocą samego git checkout. Gerrit wykorzystuje następujące polecenie, aby każdy mógł kasie dowolnego oddziału (używa pewne specjalne pozycje literatury, ale nadal obowiązuje reszta):

git fetch <url> branch && git checkout -b name FETCH_HEAD