Как мне перевести sh все филиалы в Git? (не только местные филиалы) - PullRequest
0 голосов
/ 28 апреля 2020

Мне нужно "повторно вывести" sh "все ветви (не только локальные ветви) от моего локального клона до моего источника (github-сервер).

git push --all origin только выдвигает те ветви, которые были у меня ранее проверил. Я хочу попробовать sh всех из них, включая те, которые я не проверил.

Зачем мне это нужно ? Потому что кто-то сделал git push -f --mirror, и это удалило почти все ветви с сервера (сохранились только локальные ветви этого человека).

Вещи, которые я пробовал. Отказ от ответственности : Для всех команд, которые я бы отправлял на сервер, я использую --dry-run, потому что сначала я хочу увидеть результат.

  • git push --all origin. Только выдвигает ветки, которые я ранее извлек.
  • Попытка с пустым хранилищем:
    • git clone --bare /path/to/loca/repo /some/path/BareRepo Создание локального пустого хранилища из локального хранилища.
    • git remote add origin2 https://github.com/xxx/Repo.git Добавление нового пульта на BareRepo в github.
    • git push --all origin2 Pushing. Снова только выдвигаемые ветки, которые я извлек в исходном хранилище.
  • Если я извлекаю ветку, которую я никогда не проверял, а затем запускаю push --all origin, я вижу эту ветку на вывод (- dry -запуск). Так что это запасной вариант ... оформить заказ на сотни веток. Но я ищу лучший подход.

Любые предложения?

РЕДАКТИРОВАТЬ 1 : Просто чтобы уточнить. У меня до сих пор есть мой местный клон без удаления веток. Это то, что я пытаюсь использовать для восстановления веток.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Если у вас все еще есть origin/* имена для удаленного отслеживания в вашем локальном хранилище, вы можете сделать это. Предупреждение: это немного неуклюже. Вероятно, лучше просто взять список имен в файл и отредактировать его, а не использовать трюк grep -v HEAD.

git for-each-ref --format='%(refname):refs/heads/%(refname:lstrip=3)' refs/remotes/origin | 
    grep -v HEAD |
    xargs git push origin

(на самом деле это всего одна строка, разбитая для публикации целей, хотя как три строки в sh / bash, он все еще должен работать).

Общая идея здесь - использовать каждую из ваших ссылок refs/remotes/origin/* для удаленного отслеживания, чтобы получить идентификатор ha sh для отправки на Git в origin, с просьбой создать или обновить свою ветвь с соответствующим именем.

Некоторые очень старые версии Git не будут обрабатывать %(refname:lstrip=3), так что это хороший Идея сначала запустить только часть:

git for-each-ref --format='%(refname):refs/heads/%(refname:lstrip=3)' refs/remotes/origin

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

refs/remotes/origin/HEAD:refs/heads/HEAD
refs/remotes/origin/maint:refs/heads/maint
refs/remotes/origin/master:refs/heads/master
refs/remotes/origin/next:refs/heads/next
refs/remotes/origin/pu:refs/heads/pu
refs/remotes/origin/todo:refs/heads/todo

для моего клона Git Git хранилище для Git. Обратите внимание на дополнительную строку HEAD, поэтому мы используем grep -v HEAD, что неуклюже, так как оно будет выбрасывать имя ветви, такое как SHEADWICK, если у вас есть такое имя.

0 голосов
/ 28 апреля 2020

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

git clone --bare /path/to/loca/repo /some/path/BareRepo
cd /some/path/BareRepo.git
git push --mirror https://github.com/xxx/Repo.git

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...