Git Alias ​​- несколько команд и параметров


182

Я пытаюсь создать псевдоним, который использует несколько команд Git и позиционные параметры. Для каждого есть страницы Stackoverflow, и кажется, что делать то и другое мучительно очевидно, но у меня возникли проблемы.

В качестве примера я хочу перейти на ветку foo и выполнить статус. Итак, по моему .gitconfig, у меня есть:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

который не работает. В то время как что-то подобное будет работать.

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

Любое понимание будет оценено.


Мой псевдоним: git config --global alias.go '! Git commit -a && git pull --rebase && git push && git status'. Примечание: используйте простые кавычки.
Маркус Беккер

Ответы:


157

Это будет работать (протестировано с zsh и bash):

[alias] chs = !git checkout $1 && git status

1
Нет, не будет. Git превратится git chs fooвgit checkout && git status foo
Лили Баллард

24
Интересно, что git на самом деле заполняет позиционные переменные в псевдонимах оболочки. Но он все еще сломан, потому что он также использует их в качестве аргументов. Псевдоним echo $1 && echo done, когда вызывается с аргументом 'foo', выведет как 'foo', так и 'done foo'.
Лили Баллард

7
Что означает предыдущий восклицательный знак при первом вызове git?
Элайджа Линн

21
@ElijahLynn: в псевдониме git ведущие !средства передают все это оболочке. В противном случае предполагается, что вы пытаетесь запустить другую команду git, и передает ее в качестве аргументов в gitдвоичный файл.
Лили Баллард

2
@ Брондал Умный. Я бы порекомендовал ;:вместо того, чтобы && :хотя. И это прекрасно работает и на Unix.
Лили Баллард

82

Это предназначается для Windows batch / msysgit bash; может не работать в других средах.

Как сказали Оливье Вердиер и Лили Баллард

[alias] chs = !git checkout $1 && git status

почти работает, но дает ложную дополнительную вставку аргумента ...

git chs demo -> git checkout demo && git status demo

Но если вы добавите && :в конец свой псевдоним, то ложный аргумент будет использован в теге location.

Так

[alias] chs = !git checkout $1 && git status && :

дает правильный вывод ... git chs demo -> git checkout demo && git status


9
Это && :золото и заставляет это решение работать для команд, где дополнительный аргумент будет проблематичным.
Глина

3
@Clay (или кто-то еще) - Может ли кто-нибудь объяснить BASH-оспариваемому, что && :делает?
Джастин Морган

7
@JustinMorgan && означает, что если предыдущей команде присвоено значение 0 (успех), затем выполните команду после &&. ':', двоеточие, это встроенная команда оболочки, которая не делает ничего, кроме расширения аргументов и выполнения перенаправлений, и возвращает статус 0. Вот некоторые примеры: 1. a=123;$aошибки, но a=123; : $aэто не так. 2. : > hello.txtопустошает hello.txt. 3. if [ "$a" = "hello" ];then : ;fiработает нормально, но ошибки без ':'. Это как passв питоне. 4. : this is a commentдвоеточие с последующими пробелами, как #в строке комментария.
ElpieKay

2
это такой хак ... git должен принять режим нескольких команд
kchoi

1
Спасибо @ElpieKay за объяснение. Мой локальный псевдоним git для одного проекта был, co = !git checkout public/compiled && git checkout $1и когда я это сделаю, git co masterя получу сообщение error: pathspec 'master' did not match any file(s) known to git.. Я не думал, что этот ответ будет полезен для меня, потому что первое, что он упоминает, это Windows, и я нахожусь на Linux. Но ты объяснил почему.
Тайлер Коллиер

73

Вы можете определить функцию оболочки.

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

Я видел это на другой странице stackoverflow, но мой терминал cygwin говорит, что функция не распознается, когда я пытаюсь запустить ее.
Стелла

@Stella: я оставил там заключительную цитату, которая бесполезна в этом синтаксисе файла конфигурации. Убедитесь, что у вас его нет.
Лили Баллард

2
Вау ... К сожалению, это была проблема версии. Я использовал Git 1.7.3, и ни один из этих методов не работал. Я обновился до 1.7.6 и вуаля, все заработало. Спасибо, парни!
Стелла

5
если вы используете Windows, я думаю, что вы должны окружить определение функции оболочки двойными кавычками"
drzaus

4
Ответ Оливье не работал для меня, используя параметры (OSX). Это сработало отлично.
Охад Шнайдер

25

Мне удалось создать многострочные и довольно сложные псевдонимы git. Они отлично работают на Windows, но я предполагаю, что они будут работать и в других местах, например:

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

Я написал пост и у меня есть еще несколько примеров здесь .


2
Одним из улучшений этого было бы добавление !f() { : resetдля получения завершений из команды сброса github.com/git/git/blob/master/contrib/completion/…
пользователь

Прекрасная работа! Под какой лицензией публикуется эта статья? Вы не возражаете, если я перевожу его части для StackOverflow на русский?
Ник Волынкин,

@NickVolynkin Извините за поздний ответ. Спасибо и конечно, продолжайте :)
VitalyB

22
[alias]
chs = !git branch && git status


1
Я не смог найти документацию, !но, насколько я вижу, git по умолчанию будет предполагать, что псевдоним - это команда git, поэтому она t = statusбудет работать. Однако, если вы попытаетесь, t = git statusэто не сработает (скажем, команда "git" не найдена). Так что, когда !приходит, он говорит ему, чтобы запустить команду, как если бы это была оболочка, и обычно вам это нужно, когда у вас есть несколько команд git на псевдоним, так что вы можете иметь, t = !git status && git logнапример, и это будет работать.
Лоран

Вот вопрос StackOverflow, касающийся восклицательных знаков (!) В псевдонимах Git: stackoverflow.com/questions/21083933/… .
Джейкоб Локард

6

Попробуй это:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

Назовите это так: git chs master


6

Возможно иметь многострочный псевдоним git, добавляя \в конце каждой строки.

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
Спасибо! У меня фактически не было проблем с использованием "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"моего псевдонима.
Дрооганс

3

Проблема здесь в том, что позиционные параметры, похоже, отправляются в команду оболочки дважды (начиная с git 1.9.2). Чтобы понять, что я имею в виду, попробуйте это:

[alias]
  test = !git echo $*

Затем сделать git test this is my testing string . Вы должны наблюдать следующий вывод (последние две строки отредактированы здесь для ясности):

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

Один из способов обойти это было бы

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

Это будет использовать дополнительный позиционный параметр, поскольку он будет применен к этой последней команде эха, и не повлияет на результаты.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.