`git branch --list` возвращает файлы?

Это странно. Я пытаюсь создать скрипт, который будет проверять каждую локальную ветку и переустанавливать на нее источник/мастер.

Итак, это мой сценарий:

for br in `git branch -l`; do
    git checkout $br
    git rebase origin/master
done

Простой. Но прежде чем я сделал сценарий, я хотел убедиться, что `git branch -l` возвращает то, что я думаю, что он возвращает... это не так.

git branch -l возвращает правильный результат. Но `git branch -l` на самом деле возвращает всю локальную ветвь ПЛЮС файлы в текущем каталоге!

Он возвращает это так:

[list of local branches minus master] [list of files in the current dir] master

`git branch --list` ведет себя так же.

Почему это происходит?

И есть ли лучший способ перебазировать origin/master на все локальные ветки?


person Nacht    schedule 03.07.2013    source источник
comment
вам действительно не следует использовать свои собственные псевдонимы в подобном вопросе:/   -  person Nevik Rehnel    schedule 03.07.2013
comment
Небольшое замечание: я считаю, что вы на самом деле перебазируете все ветки на мастер, а не наоборот (просто вопрос обозначения)   -  person pgilmon    schedule 03.07.2013
comment
Примечание. Обязательно используйте git branch --list: см. stackoverflow.com/a/51431590/6309.   -  person VonC    schedule 20.07.2018


Ответы (2)


Это какая-то глупость.

git branch --list ставит звездочку перед выбранной в данный момент веткой; ваш сценарий оболочки интерпретирует это как подстановочный знак и добавляет файлы в текущем каталоге в список элементов для прохождения с помощью цикла for.

Ты можешь попробовать

for br in `git branch -l | tr '*' ' '`; do
    git checkout $br
    git rebase origin/master
done
person antlersoft    schedule 03.07.2013
comment
antlersoft, для людей, которые не используют псевдоним br для ветки, пожалуйста, замените br на ветку в своем ответе. Я знаю, что ваш сценарий будет работать для Nacht, но подумайте о других людях, которые смотрят на это. Я проголосовал за вас, поскольку это отвечает на вопрос Нахта. Также рассмотрите возможность изменения co на checkout. Спасибо! - person cforbish; 03.07.2013

Другая вещь, которую вы можете сделать, на самом деле не нужна здесь, но полезна для более надежных сценариев, так сказать, это использовать git for-each-ref для извлечения нужных вам ссылок. Например, эквивалентом git branch --list за вычетом префикса пробела или звездочки является:

$ git for-each-ref refs/heads/ --format='%(refname:short)'

как в этом примере:

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git for-each-ref refs/heads/ --format='%(refname:short)'
master

Точно так же вы можете получить пульты (git branch -r), используя refs/remotes/ вместо refs/heads/, и вы можете найти теги, используя refs/tags/. Есть даже дополнительные опции с for-each-ref, предназначенные для защиты строк от различных действий программы (не нужны в данном конкретном случае, см. документацию по git check-ref-format и ее ограничения на имена веток), но позволяющие использовать eval на выходе git for-each-ref.

person torek    schedule 03.07.2013
comment
Хотя @antlersoft объяснил, в чем причина проблемы, я предпочитаю решение здесь. Он кажется более надежным. :) - person Friederike; 25.11.2019