Налаштуйте git, щоб тягнути і натискати всі гілки


615

Я б хотів за замовчуванням натиснути і потягнути всі гілки, включаючи новостворені.

Чи є налаштування, яке я можу визначити для нього?

Інакше, коли я додаю нову гілку локально і хочу витягнути її з сервера, який найпростіший спосіб це зробити?

Я створив нову гілку з такою ж назвою і спробував витягнути, але це не працює. Запитує мене про всі віддалені конфігурації гілки. Як це встановити.


4
"і намагався витягнути, але це не працює". Деталі, будь ласка. Покажіть нам, яку команду ви намагалися використовувати.
Якуб Нарбський

Відповіді:


1297

Найпростіший спосіб - це зробити:

git push --all origin

Це підштовхне теги та гілки.


10
Серед десятків відповідей, які я знайшов на SO та інших місцях, це найпростіший спосіб просунути новостворену локальну гілку, не торкаючись конфігурації. Дякую!
András Szepesházi

174
І якщо ви додасте -uодин раз, наприклад git push --all origin -u, налаштування відстеження і після цього ви можете просто використовувати git push.
Алек

23
Для версії git 1.7.12.3 мені довелося використовувати git push --tags originдля натискання всіх тегів.
thisgeek

17
Також подивіться на "--mirror" замість "--all" цього натиску більше матеріалів
Loda

21
ПОПЕРЕДЖЕННЯ. Якщо у вас є купа локальних гілок, які ви не очистили (функції, виправлення) - або не очистили належним чином (мені), це затопить ваш пульт. Блін. І ми просто зробили обрізку. Не знаю, чому в моїх місцевих залишилось стільки гілок.
Джек

147

Завдяки сучасному git ви завжди отримуєте всі гілки (як віддалене відстеження гілок у refs/remotes/origin/*просторі імен, видно з git branch -rабо git remote show origin).

За замовчуванням (див. Документацію push.defaultзмінної конфігурації) ви натискаєте відповідні гілки , а це означає, що спочатку вам потрібно зробити git push origin branchgit, щоб завжди натискати його git push.

Якщо ви хочете завжди натискати всі гілки , ви можете налаштувати refspec push. Якщо припустити, що пульт названо, originви можете використовувати git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

або безпосередньо відредагуйте .git/configфайл, щоб мати щось подібне:

[віддалене "походження"]
        url = user@example.com: /srv/git/repo.git
        fetch = + refs / heads / *: refs / Remotes / origin / *
        fetch = + refs / теги / *: refs / теги / *
        push = + refs / heads / *: refs / heads / *
        push = + refs / теги / *: refs / теги / *

3
@Merc: git push --all originдобре одноразово публікувати всі гілки та теги, хоча за замовчуванням до семантичної семантичної версії "відповідність" означатиме, що ви будете натискати всі гілки згодом ... якщо ви не додасте нову гілку чи тег. Установка на «поштовх [...] всі гілки за замовчуванням» буде , як написано.
Якуб Нарбський

Ви можете вдосконалити відповідь, щоб додати спосіб перенастроювання Git таким чином. Це корисно для користувачів, які встановили простий режим.
Дерексон

3
Це змінилося з часу git 2.0. За замовчуванням Push простий, більше не відповідає.
Майк

Я спробував це і отримав помилку при натисканні: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Примітка: я на git 2.0. Я все ще розробляю, як це виправити.)
Брайан Лейсі

2
Тепер значенням за замовчуванням push.defaultє simple.
hasanghaforian

32

Включення + у специфікацію push - це, мабуть, погана ідея, оскільки це означає, що git буде щасливо робити нешвидкісний рух вперед навіть без -f , і якщо віддалений сервер налаштований на їх прийняття, ви можете втратити історію.

Спробуйте саме це:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

Ви також можете додати --globalпараметр до кожного з них, щоб зробити це загальним за замовчуванням для всіх ваших сховищ.
Ефір

Прикро, що + додається автоматично git під час виконання git remote add.
Ефір

26

Я використовував команди нижче, щоб перемістити всі гілки до нового сховища.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

ПРИМІТКА : Мені довелося використовувати команду другого останнього (тобто push master first) під час клонування репо з Atlassian Stash в AWS CodeCommit (порожнє репо). Я не впевнений, що причина, але після натискання ( git push new-origin --mirror) гілка за замовчуванням посилалася на якусь іншу гілку, ніж master.


1
Ідеально підходить для переміщення репо до іншого хоста. Дякую!
Пелмед

2
Це дійсно єдиний корисний метод. Використовуйте git push new_origin --allлише натисніть на свої поточні місцеві гілки до new_origin, а не всіх гілок походження.
yanzi1225627

Тільки зазначивши, що це робить --bareсховище, яке трохи відрізняється від звичайного сховища, у ньому є лише .gitфайли, а не ваші файли. Цього цілком достатньо, якщо ви не збираєтеся в ньому працювати. Див. --bareТа --mirror git-scm.com/docs/git-clone .
jmmut

Незважаючи на те, що в ньому є лише файли .git, а не власне вихідний код, якщо ви виконаєте віддалене оновлення, воно перезавантажить все, починаючи від джерела до місця призначення.
SanthoshM

Це був рятівник! Цей метод "майстра перед дзеркалом" вирішив проблему, в якій Bitbucket є місцем призначення, і вважають, що інша галузь, відмінна від "master", була основною гілкою.
Тоддіус Жо

12

Якщо ви переміщуєте гілки до нової репо-версії зі старої та НЕ маєте всіх старих гілок репо-локальних, вам потрібно спочатку відстежити їх.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Потім додайте нове віддалене репо:

git remote add bb <path-to-new-repo>

Потім ви можете натиснути всіх, використовуючи цю команду:

git push -u bb --all

Або ви можете налаштувати репо, використовуючи команди git config, зазначені в інших відповідях тут, якщо ви цього не робите одноразово або хочете лише перемістити локальні гілки.

Важливий момент, інші відповіді лише підштовхують всі місцеві гілки. Якщо гілки існують лише в альтернативному сховищі REMOTE, вони не будуть переміщуватися, не відстежуючи їх спочатку. Представлений тут цикл for допоможе в цьому.


До речі, тут я використовую "bb" замість "origin", тому що я припускаю, що ваш початковий / старий сховище було названо "origin" і, ймовірно, все ще додається до цієї мітки. "bb" призначений для Bitbucket, куди я перемістив своє оригінальне репо, але ви можете назвати це щось більш застосовне, наприклад, "neworigin", якщо ви хочете.
Ленс Клівленд

2
Це не працювало для мене. Закінчено всіма віддаленими гілками, які відстежують ту саму локальну гілку: /
jhsowter

2
AFAIK, це не повинно працювати, відповідно до коментаря @jhsowter. правильна команда для мене відстежувати віддалену гілку в новому клонованому репо, git branch --track reponame origin/reponameінакше ви отримаєте відслідковувати всі віддалені гілки на поточній місцевій гілці
Pioneer Skies

Я змінив фрагмент повторного збору на git branch -r | grep -v '\->' | sed 's/ origin\///', який дає лише назву віддаленої гілки.
Пол Хікс

6

Щоб побачити всі гілки з використанням git branch -a, слід виконати:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

Тепер ви можете бачити всі гілки:

git branch

Щоб натиснути всі гілки, спробуйте:

git push --all

1
λ git fetch - всі походження фатально: fetch --all не бере аргумент сховища
foxundermon

ти намагаєшся git fetch --all?
тохі

4

Якщо ви переміщуєте всі гілки до нового репо з старого, тоді у вашому локальному репо потрібно встановити відстеження кожної гілки до існуючих гілок походження, перш ніж натиснути на нове репо, в іншому випадку всі ваші гілки походження не з’являться у нове походження. Зробіть це вручну, відстежуючи або перевіряючи кожну гілку, або використовуйте один вкладиш:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Ця командна команда одного рядка заснована на її версіях в інших відповідях на цій сторінці, але, можливо, краща, оскільки:

  1. вона правильно налаштовує відстеження гілок, на відміну від деяких старих варіантів цієї команди на цій сторінці, які подають лише один параметр --Track, і, таким чином, кожна гілка закінчується майстром відстеження - не добре
  2. називає локальні гілки без префіксу "походження /", якого я особисто не хочу - і відповідає тому, що відбувається, коли ви звичайно перевіряєте відділення.
  3. пропускає майстер стеження, оскільки це вже відбувається
  4. насправді не перевіряє нічого, таким чином, це швидко
  5. уникає спотикання над -> у виході гілки гіта -r

Далі, якщо ви перемикаєте джерела, замініть посилання на старе джерело та вкажіть новий пульт. Переконайтесь, що спершу ви створили новий віддалений, використовуючи бітбукет / github GUI, але не додайте до нього жодних файлів, або виникне проблема злиття. Напр

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

Тепер натисніть. Зверніть увагу, що друга команда потрібна і для натискання тегів:

git push -u --all origin
git push --tags origin

0

Рішення без жорсткого кодування origin в конфіг

Використовуйте наступне у своїй глобальній gitconfig

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Це висуває всі гілки та всі теги

Чому НЕ слід вводити жорсткий код originу конфігурацію?

Якщо ви жорсткий код:

  1. Ви закінчитесь originяк віддалений у всіх репостах. Таким чином, ви не зможете додати походження, але вам потрібно скористатися set-url.
  2. Якщо інструмент створює пульт із іншим іменем, натиснути все конфігурації не буде. Тоді вам доведеться перейменувати віддалений, але перейменування не буде працювати, оскільки воно originвже існує (з пункту 1) запам'ятайте :)

За доглядом подбає вже сучасний git

Відповідно до відповіді Якуба Нарбського:

Завдяки сучасному git ви завжди отримуєте всі гілки (як відділення віддаленого відстеження у просторі імен refs / remote / origin / *

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.