Добавить переменные в вывод состояния git - PullRequest
1 голос
/ 16 марта 2011

Как я могу изменить вывод состояния git для обработки каждого пути как переменной, которую я могу использовать для выполнения других команд?

Пример:

$ git status
# On branch master
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       {1} modified:   path/to/some/file.txt
#       {2} modified:   path/to/some/other/file.txt
#       {3} modified:   some/really/long/path/to/some/file.txt

$ git add {2}

$ git status
# On branch master
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   path/to/some/other/file.txt
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       {1} modified:   path/to/some/file.txt
#       {2} modified:   some/really/long/path/to/some/file.txt

Это может быть полезно при работес большим количеством файлов или длинными путями к файлам.Я подозреваю, что это очень сложно (или невозможно) сделать, хотя?

Ответы [ 4 ]

1 голос
/ 16 марта 2011

Это похоже на git add --interactive с обновлением mode

со страницы руководства git add :

update

Показывает информацию о состоянии и выдает приглашение "Update>>".
Когда приглашение заканчивается двойным >>, вы можете сделать более одного выбора, объединенного спробел или запятая.
Также вы можете сказать диапазоны.Например, "2-5 7,9", чтобы выбрать 2,3,4,5,7,9 из списка.Если второе число в диапазоне опущено, все оставшиеся патчи принимаются.Например, "7-", чтобы выбрать 7,8,9 из списка.Вы можете сказать * выбрать все.

То, что вы выбрали, затем будет выделено *, например:

           staged     unstaged path
  1:       binary      nothing foo.png
* 2:     +403/-35        +1/-1 git-add--interactive.perl
0 голосов
/ 14 декабря 2011

Недавно у меня был такой же зуд, как и у вас, и я написал git-number , чтобы поцарапать его. Это именно то, что вы хотите. Тем не менее, прочитайте раздел «Предостережение» в README.

Краткое руководство:

$ alias gn='git number'
$ alias ga='git number add'

$ gn
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#1      .README.swp
#2      README

$ ga 2
git add  README  # <- It does this in the background

Вы также можете запустить произвольную команду для файлов:

$ gn -c ls -l 1 2

Это будет работать ls -l .README.swp README

0 голосов
/ 17 марта 2011

Пожалуйста, уточните?

Вы все равно должны набрать {1} или {2}, что является неуклюжим и очень подвержено ошибкам.

Возможно, вы захотите реализовать нечеткий / инкрементальный поиск на вашем любимом языке.Или просто убедитесь, что все «негодяи», которые вы, очевидно, никогда не интересуетесь обновлением, не находятся в списке в первую очередь (.gitignore)

Вот грубый удар по быстрой функции bash с именем 'scommit '(smart commit?):

#!/bin/bash

function scommit()
{
    set -e
    local PS3='add (or Ctrl-D)? '
    local arguments
    if [[ $# -lt 1 ]]; 
        then arguments='.*'
        else arguments=( "$@" )
    fi

    function grepmodified() { git ls-files -m | egrep "${arguments[@]}"; }
    function pickone()      
    { 
        if [[ $# -ge 1 ]]; then 
            select path in "$@"; 
            do git add -- "$path"; break; 
            done;   
        else 
            return 1; 
        fi
     }

    while pickone $(grepmodified); do continue; done
}

Вы можете использовать его следующим образом (обратите внимание, как флаг -i передается egrep, делая его без учета регистра):

$ scommit -i bi
1) main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Gui.OptionPanels.KeyBindingsPanel.cs
2) main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.OptionPanels.CombineBuildOptionsWidget.cs
add (or Ctrl-D)? 1
1) main/src/core/MonoDevelop.Ide/gtk-gui/MonoDevelop.Ide.Projects.OptionPanels.CombineBuildOptionsWidget.cs
add (or Ctrl-D)? 1
0 голосов
/ 17 марта 2011

Если вы обычно меняете какой-либо тип файла или конкретный путь, используйте ls-файлы, затем grep их:

git ls-files -o | grep some-part-of-the-path-or-extension | xargs git add

Подробнее об этом здесь: http://www.kernel.org/pub/software/scm/git/docs/git-ls-files.html

Вы можете использовать псевдоним как команду, если хотите. Это будет гораздо быстрее, чем читать, что дает add --interactive, а затем проверять соответствующие значения.

Тогда есть также git gui, если у вас их ужасное количество.

Надеюсь, это поможет.

...