Я пытаюсь создать псевдоним git для извлечения удаленных веток на основе этого ответа
git branch -r \ | grep -v '\->' \ | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" \ | while read remote; do \ git branch --track "${remote#origin/}" "$remote"; \ done git fetch --all git pull --all
Я пытаюсь создать для этого псевдоним:
git config --global alias.pull-all '!'"f() { git branch -r | grep -v -- '->' | sed \"s,\x1B\[[0-9;]*[a-zA-Z],,g\" | while read b; do git branch --track \"\${b##origin/}\" \"\$b\"; done; git pull --all }; f"
Но когда я использую псевдоним, я получаю синтаксическую ошибку оболочки (zsh) «неожиданный конец файла»:
$ git pull-all
f() { git branch -r | grep -v -- '->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read b; do git branch --track "${b##origin/}" "$b"; done; git pull --all }; f: -c: line 1: syntax error: unexpected end of file
Но копирование сообщения об ошибке в мою командную строку работает отлично:
$ f() { git branch -r | grep -v -- '->' | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read b; do git branch --track "${b##origin/}" "$b"; done; git pull --all }; f
branch 'a-branch' set up to track 'origin/a-branch'.
fatal: a branch named 'main' already exists
Already up to date.
Как я могу исправить псевдоним, чтобы все удаленные ветки были извлечены так же, как и при вводе команды вручную?
@Fictional git pull --all
не упоминается в документации, потому что это опция, которая pull
передается fetch
, а в fetch
это означает совсем другое — выборка со всех удаленных устройств, а не со всех ветвей. В варианте git push
--all
означает все ветки.
@phd, да, я никогда этим не пользуюсь, я предпочитаю отправлять по одной ветке за раз. Это звучит грязно. Я не уверен, как я это пропустил, в документации действительно упоминается --all в разделе «Параметры, связанные с выборкой».
Оказывается, функциям нужна точка с запятой или новая строка перед закрывающей скобкой.
git config --global alias.pull-all '!'"f() { git branch -r | grep -v -- '->' | sed \"s,\x1B\[[0-9;]*[a-zA-Z],,g\" | while read b; do git branch --track \"\${b##origin/}\" \"\$b\"; done; git pull --all; }; f"
См. также stackoverflow.com/questions/67864796/…
@matt, ты думаешь, это лучшее решение, чем то, что у меня есть сейчас?
Псевдоним, который вы пытались написать, не является должным образом экранированным кавычками.
git config --global alias.pull-all '!'"f() { git branch -r | grep -v -- '->' | sed \"s,\x1B\[[0-9;]*[a-zA-Z],,g\" | while read b; do git branch --track \"\${b##origin/}\" \"\$b\"; done; git pull --all }; f"
Если вам нужно, чтобы кавычки внутри псевдонима были правильно экранированы, я могу разбить его на более простые и правильно завершить.
git config --global alias.pull-all '!git branch -r | grep -v -- "->" | sed "s,\x1B\[[0-9;]*[a-zA-Z],,g" | while read b; do git branch --track "${b##origin/}" "$b" 2>/dev/null; done && git fetch --all && git pull --all'
pull --all
это вещь? В документах это не упоминается. Кроме того, чего вы пытаетесь достичь, чего получение еще не дает? Я бы не считал одновременное манипулирование несколькими локальными ветками хорошей практикой.