将变量添加到git status输出

时间:2011-03-16 13:48:27

标签: git msysgit

我如何修改git status输出以将每个路径视为可用于执行其他命令的变量?

示例:

$ 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 个答案:

答案 0 :(得分:1)

使用更新模式看起来像 git add --interactive

来自git add man page

更新

  

显示状态信息并发出“Update>>”提示   当提示以double >>结尾时,您可以进行多个选择,与空格或逗号连接。
  你也可以说范围。例如。 “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

答案 1 :(得分:0)

如果您经常更改某些文件类型或特定路径,请使用ls-files然后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

希望这有帮助。

答案 2 :(得分:0)

请澄清一下?

您仍然需要键入{1}或{2},这是笨拙且非常容易出错的。

您可能希望用自己喜欢的语言实现一种模糊/增量查找。或者只是确保您显然从未对更新感兴趣的所有“残骸”都不在列表中(.gitignore)

这是对名为'scommit'(智能提交?)的快速bash函数的粗略尝试:

#!/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

答案 3 :(得分:0)

我和你的痒一样,我写了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