gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:54:16 29 4
gpt4 key购买 nike

我要git add 仅使用单个 shell 命令从文件中提取特定范围的行。我正在想象类似的东西:

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

不想使用git add -igit add -pgit -e(交互式 git 工具),因为我的文件很大并且有很多更改,而且我已经准确地知道我想要哪一行。为了争辩(明白吗?),假设我想暂存包含 2000 行文件 myfile.go123-204 行。

也不想使用GUI。要么我的电脑对新程序来说太旧,要么运行速度太慢,要么屏幕太小……随便什么。综上所述。 Github 图形用户界面,Sourcetree , (Atom|IntelliJ|VSC|.* 插件, KDiff, Kaleidescope...它们都出来了。

可以吗?

加分点:是否可以同时处理多个文件?

供引用:

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

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

最佳答案

从评论中,不清楚您是否关心执行添加操作的效率、需要完成的输入以指示工具做什么,或两者兼而有之。

我不会担心前者;如果您为此担心,您也无能为力。有比您认为合理的更多步骤,它们涉及处理整个文件;但实际上,这并不重要,因为我从未见过单个文件暂存操作需要足够的时间来担心它。

至于涉及的输入量,您列出的 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 add -e 时将该脚本设置为编辑器(即通过设置 GIT_EDITOR 环境变量)。您将使用 @@ -#,# +#,# @@ 形式的行来计算更改受影响的行号,使用该信息(和您的假设)来决定是否需要保留或丢弃给定的更改行,以及是否要丢弃它

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

关于Git 不以交互方式添加特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50627024/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com