Git不以交互方式添加特定行

时间:2018-05-31 14:45:46

标签: git

我想git add 只有来自具有单个shell命令的文件的特定行范围。我的成像方式如下:

git add -c myfile.go@123..204

不希望使用git add -igit add -pgit -e(交互式git工具),因为我的文件很大而且很多变化,我已经确切地知道我想要哪些线。为了争论(得到它?),让我们说我想在2000行文件123-204中包含myfile.go行。

也不希望使用GUI。我的计算机对于新程序来说太旧了,运行得太慢,屏幕太小......等等。以上所有。 Github GUI,Sourcetree(Atom|IntelliJ|VSC|.*插件,KDiff,Kaleidescope ......他们全力以赴。

可以吗?

加分:可以一次为多个文件完成吗?

供参考:

两个相关的但不重复的问题。两者都不符合我的需求:

Git文档已经关闭,但没有雪茄:

2 个答案:

答案 0 :(得分:5)

根据评论,目前还不清楚您是否关注执行添加操作的效率,需要进行的输入以指示工具执行操作,或两者兼而有之。

我不担心前者;如果你 担心它,你无论如何也无能为力。有许多步骤可能比你认为合理,他们涉及处理整个文件;但实际上,这并不重要,因为我从未见过单文件分段操作需要花费足够的时间来担心它。

至于所涉及的输入数量,您列出的add选项是最接近的内置支持git优惠。所以你可以做一些脚本来增强它们。但要确保它始终“正确”并不容易。

特别是,它比你可能意识到的定义“这一系列线的变化”更棘手。看似显而易见的问题是,行添加和删除会改变它们之后出现的行数;但您可以通过根据文件的当前工作版本定义行号范围来解决这个问题(因为这是确定行号范围时最近可能会查看的内容)。

但更大的问题是检测范围中所有行都已编辑的情况,并且该范围与您正在进行分段更改的行范围的末尾重叠。例如,假设您有文件

1
2
3
4
5
索引中的

,您的工作副本说

1
2
3 THREE
4 FOUR
5 FIVE

现在您指定要从第2-4行暂存更改。

补丁看起来像

@@ -1,5 +1,5 @@
 1
 2
-3
-4
-5
+3 THREE
+4 FOUR
+5 FIVE

很明显在这种情况下直观的结果是

1
2
3 THREE
4 FOUR
5

但编写能够让这种“正确”的代码而不会让其他情况“错误”(相对于同样直观的解释)并不容易。有时它真的可以解释。 “这一次操作改变了三条线路吗?或者一条操作删除了三条线路,然后是三条操作,每条线路都添加了一条线路?或者......”

git中的自动化工具避免做出那些解释性决策,首先通过查看变化(而不是任意行范围)中的代码,并且如果你想要不同的东西(即通过使用补丁编辑模式),让你手动干预;然后通过插入冲突标记(并再次需要手动干预),似乎仍然需要解释。

所以你基本上必须做出简化假设来构建工具,并确保在使用工具时这些假设是有效的。

然后,想法是创建一个脚本,从第一个参数命名的文件中读取补丁并编辑补丁;并在运行GIT_EDITOR时将该脚本设置为编辑器(即通过设置git add -e环境变量)。您可以使用@@ -#,# +#,# @@形式的行来计算更改的受影响的行号,使用该信息(和您的假设)来决定是要保留还是丢弃给定的更改行,如果您想要丢弃它

  • 如果该行以-开头,请将-更改为
  • 如果该行以+开头,请删除该行

答案 1 :(得分:0)

我已经对此进行了调查,但并未进行广泛研究。我的理解是,git add -p 的工作方式是生成补丁,提供一个直观的界面来编辑和应用它们。

您可以自己完成此过程。

您的工作树中的更改由 git diff 提供。这些更改可以使用 git apply

作为补丁应用于您的索引

所以你可以运行而不是 git add .

git diff . | git apply - --cached

即。获取当前目录下工作树中的所有差异,并将所有差异应用到索引中。

所以你可以做的是自己修改差异的输出并在应用它之前生成一个不同的补丁,使用脚本或任何方法。

可能是使用脚本修改此过程比选择 git add -egit add -p 解决方案更棘手,但据我所知,如果您愿意,这是解决问题的方法以不同的方式解决它。