2013-12-07 5 views
3

Я делаю резервный скрипт для локального репозитория git. Я просмотрел возможности и выбрал пакет для выполнения задачи. шаги я взял:Git bundle add remote

  1. Создать новый репозиторий, сделайте инициал совершает

    Когда я проверить репо с git branch -a я получаю следующее: * master

  2. git bundle create ./test.bundle --all

К настоящему времени, когда я проверяю комплект с git bundle list-heads Я получаю 2 ссылки: 1 для HEAD, а другой для refs/heads/master.

Когда я тяну этот пакет в новое хранилище с git clone, ветви выглядеть следующим образом:

*master 
remotes/origin/HEAD -> remotes/origin/master 
remotes/origin/master 

Почему это происходит? Есть ли способ импортировать только те ветки, где в первом хранилище без пультов?

EDIT:

Мой вопрос мог бы быть немного неясно. Вот что я хотел бы достичь:

  1. Имейте репо с 2-мя ветвями, мастер и тест.
  2. расслоение всех ветвей (сделанных с git bundle --branches как было предложено)
  3. rm всего Репо
  4. Восстановления репо с мерзавца клоном. К сожалению, я должен дать параметр ветви, так как я получаю следующее сообщение об ошибке без нее: warning: remote HEAD refers to nonexistent ref, unable to checkout.

Единственная проблема, которая возникает в том, что я получаю следующие ветви после клона:

*master 
remotes/origin/master 
remotes/origin/test 

При переходе к test, я получаю сообщение о том, что была создана новая ветка. Есть ли способ клонировать все ветви, чтобы он мог выглядеть как исходное репо?

*master 
test 
+0

никаких оснований для downvote? –

ответ

1

Когда вы клонируете из связки, ветви в комплекте будут напоминать пульты в вашем клоне. Это нормально.

Хотя git bundle list-heads показывает удаленные ссылки исходного хранилища, вы не увидите их в новом клоне. Я имею в виду, например:

$ git bundle list-heads test.bundle 
a742ee94e8fcef80eb5619f76674bb79d7011742 refs/heads/test2 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/heads/master 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/HEAD 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/master 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/test1 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af HEAD 

Тогда клонировать из этого:

$ git clone test.bundle clone2 
$ cd clone2 
$ git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 
    remotes/origin/test2 

То есть, нет никаких признаков оригинального пульта дистанционного управления с его test1 отрасли.

Вы могли создать пакет без удаленных ссылок, как это:

$ git bundle create test.bundle --branches HEAD 

Но я не уверен, если это будет иметь большое значение. Я никогда не работал с пакетами, поэтому, возможно, этот ответ можно улучшить.

UPDATE

При штамповке из пучка, пучок рассматривается как пульт дистанционного управления, нового начала координат, с точки зрения вашего нового клона. Когда вы клонируете, локальная ветвь создается только для HEAD, остальные ветви остаются в начале координат. Если вы хотите избавиться от расслоения полностью, вы можете создать местные отделения для всех ветвей в пучке удаленных (= координаты), а затем удалить удаленные и удалить пакет, с чем-то вроде этого:

for b in $(git branch -r | grep -v HEAD | cut -f2 -d/); do 
    git show-ref --verify --quiet refs/heads/$b || git checkout $b 
done 

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

+0

, но не является - филиалы HEAD, просто хранящие голову в комплекте? Я хотел бы сохранить все ветки в комплекте. –

+0

'--branches' добавит все' refs/heads/* ', поэтому все ветви. Так что это звучит так, как вы хотите. Ты это пробовал? – janos

+0

попробует сейчас –

1

Мне удалось найти ответ. Вот что я сделал:

Как предложил янос, я сделал связку со всеми ветвями. Сделано git clone, на полученном комплекте. Теперь для каждого ref я проверил ветку и удалил удаленную ветку.

В конце я удалил ссылку удаленной HEAD.

Я нашел этот вопрос весьма полезным: How to clone all remote branches in Git?

+0

Кажется, вы упустили параметр 'HEAD' в команде, которую я вам дал:' git bundle create test.bundle --branches HEAD'. Он был там, поэтому вы не получили предупреждения, упомянутого в своем обновлении. Я также обновил свой пост скриптом для проверки всех удаленных филиалов. Перспектива и прием будут приятными ... – janos

Смежные вопросы