我如何修改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
在处理大量文件或长文件路径时,这可能很有用。我怀疑这是非常棘手的(或不可能的)吗?
答案 0 :(得分:1)
使用更新模式看起来像 git add --interactive
更新
显示状态信息并发出“
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