Выбор удаленных пультов и удаленных удаленных филиалов - PullRequest
1 голос
/ 18 февраля 2011

Я хотел бы получить удаленные ветви удаленного репозитория.

Так, например, в этой ситуации -

$ cd alpha
$ git remote
beta
$ git branch -a
master
remotes/alpha/master
$ cd ../beta
$ git remote
gamma
$ git branch -a
master
remotes/gamma/slave

- Я хотел бы получить gamma * slave ветвится в alpha хранилище, пройдя через beta.Предположительно, это добавит gamma в качестве удаленного элемента alpha и будет использовать gamma/slave для refspec новой ветки.Я не обязательно хочу создавать локальную ветку отслеживания.У меня также не обязательно есть доступ к файловой системе к beta или gamma, в отличие от примера.

Такого рода вещи можно сделать с помощью $ git clone --mirror, но есть ли способ сделать это вуже существующий репо?

1 Ответ

0 голосов
/ 20 февраля 2011

Похоже, что установка refspec не по умолчанию приведет меня туда-сюда.

Например, рассмотрим это setup :

  • Initializegamma

    $ (mkdir gamma; cd gamma; git init; touch README; git add README;
       git commit -m 'Initialized slave.'; git branch -m slave; echo)
    Initialized empty Git repository in /tmp/test-git/gamma/.git/
    [master (root-commit) 0cebd50] Initialized slave.
     0 files changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 README
    
  • Инициализировать beta и добавить gamma в качестве удаленного:

    $ (mkdir beta; cd beta; git init; touch README; git add README;
       git commit -m 'Initialized master.';
       git remote add gamma ../gamma; git fetch gamma
       echo; echo "In repo $(basename $PWD):"; git branch -a; echo)
    Initialized empty Git repository in /tmp/test-git/beta/.git/
    [master (root-commit) f6512e1] Initialized master.
     0 files changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 README
    warning: no common commits
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0)
    Unpacking objects: 100% (3/3), done.
    From ../gamma
     * [new branch]      slave      -> gamma/slave
    
    In repo beta:
    * master
      remotes/gamma/slave
    
  • клон betaсделать alpha:

    $ git clone beta alpha
    Initialized empty Git repository in /tmp/test-git/alpha/.git/
    $ cd alpha; git branch -a
    * master
      remotes/origin/HEAD -> origin/master
      remotes/origin/master
    

Теперь яростно:

# Avoid errors from pulling into active branch.
$ git checkout origin/master  | head -3  # intentionally acquire severed HEAD
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
$ git fetch origin '+refs/*:refs/*'      # pour steroids into open esophagus
From /tmp/test-git/beta
 * [new branch]      gamma/slave -> gamma/slave
$ git branch -a
* (no branch)
  master
  remotes/gamma/slave
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git remote
origin

Так что делать `$ git fetch '+ refs / : refs/ 'будет извлекать саму ветвь, но не будет обновлять элементы конфигурации, которые составляют удаленный, к которому он принадлежит.

Интересно, что установка ветви отслеживания для удаленной удаленной ветви приведет к ее запускуотслеживание собственного репо:

$ git branch --track slave gamma/slave 
Branch slave set up to track local ref refs/remotes/gamma/slave.
$ git config -l | grep '^remote\|^branch'
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=/tmp/test-git/beta
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.slave.remote=.
branch.slave.merge=refs/remotes/gamma/slave

Я думаю, что это на самом деле не работает.

$ git checkout slave
Switched to branch 'slave'
$ git fetch
From .
 * remote branch     gamma/slave -> FETCH_HEAD
$ git fetch
From .
 * remote branch     gamma/slave -> FETCH_HEAD
...