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

irb*_*ana 8 git

希望来自具有单个shell命令的文件的特定范围的行.我想像这样的东西:git add

git add -c myfile.go@123..204
Run Code Online (Sandbox Code Playgroud)

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

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

可以吗?

奖励积分:可以一次为多个文件完成吗?

以供参考:

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

Git文档很接近,但没有雪茄:

Mar*_*ger 5

从注释中,尚不清楚您是否担心执行添加操作的效率,是否需要执行指示命令工具执行操作的键入或这两者。

我不用担心前者。如果你担心它,有没有什么可以做呢。还有比您认为合理的步骤还多,它们涉及处理整个文件。但实际上,这并不重要,因为我从未见过单文件登台操作需要花费足够的时间来担心它。

至于涉及的打字量,add您列出的选项是最接近的内置支持服务git。因此,您可以编写一些脚本来扩充它们。但是要确保始终“正确”并不容易。

特别是,定义“此行范围的更改”比您可能意识到的要难。看似很明显的问题是,行的增加和删除会改变行之后的行的行号;但是您可以通过根据文件的当前工作版本定义行号范围来解决此问题(因为这是确定行号范围时最近可能要查看的行号)...

但是更大的问题是,要检测某个范围内的所有行均已被编辑的情况,并且该范围与您要分段更改的行的范围的末端重叠。例如,假设您有文件

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

在索引中,而您的工作副本说

1
2
3 THREE
4 FOUR
5 FIVE
Run Code Online (Sandbox Code Playgroud)

现在,您指定要从2-4行开始更改。

该补丁看起来像

@@ -1,5 +1,5 @@
 1
 2
-3
-4
-5
+3 THREE
+4 FOUR
+5 FIVE
Run Code Online (Sandbox Code Playgroud)

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

1
2
3 THREE
4 FOUR
5
Run Code Online (Sandbox Code Playgroud)

但是编写获得这种“正确”而没有使其他情况“错误”(相对于同等直观的解释)的代码并不是那么容易。有时,它确实可以接受解释。“这是更改了三行的一个操作?还是删除了三行的一个操作,然后是每个添加一行的三个操作?或者...”

git中的自动化工具避免了做出这些解释性决定,首先是通过查看变化较大的代码(而不是任意的行范围),并在需要更改时手动进行干预(例如,使用补丁编辑模式);然后在似乎仍需要解释时插入冲突标记(并再次需要人工干预)。

因此,您基本上必须做出简化的假设才能构建工具,并确保这些假设在使用工具时有效。

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

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