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
@Brondahl Clever. Я б рекомендував ;:замість цього && :. І це добре працює і на Unix.
Лілі Баллард

82

Це орієнтоване на Windows batch / msysgit bash; може не працювати в інших середовищах.

Як сказали Олів'є Верд'є та Лілі Баллард

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

майже працює, але дає хибну додаткову вставку аргументу ...

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

Але якщо ви додасте && :до кінця свого псевдоніма, то помилковий аргумент вводиться в тег локації.

Так

[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

8
Для чого це !?
AutonomousApps

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"свій псевдонім.
Droogans

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

Це буде використовувати додатковий позиційний параметр, коли він застосовується до цієї останньої команди echo і не впливає на результати.

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