首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将特定行划分为git

如何将特定行划分为git
EN

Stack Overflow用户
提问于 2022-11-29 06:58:44
回答 1查看 51关注 0票数 1

我希望能够在特定的代码行中匹配一个模式(在我的例子中是MARKETING_VERSION)。

我得到了awk命令,它将显示与模式MARKETING_VERSION匹配的行,但我不知道如何将从该结果到git的行划分。

awk '/MARKETING_VERSION/{print NR}' exampleFile.txt终端中的结果是

代码语言:javascript
复制
1191
1245

如何使用此结果将该文件中的特定行划分为git?

我知道您可以使用git add -p,但是我想在shell脚本中使用它,所以我需要一个非交互式版本。

提亚

EN

回答 1

Stack Overflow用户

发布于 2022-11-29 10:50:33

粗略地说,git add -p <file>所做的是:

代码语言:javascript
复制
tmpfile=$(mktemp)
tf2=$(mktemp)
tf3=$(mktemp)
git diff <file> > $tmpfile
while [ -s $tmpfile ]; do
    extract first diff hunk from $tmpfile to $tf2 and rest to $tf3
    show you $tf2, ask if you want to include this hunk
        (with options to edit the hunk, etc); repeat until ready
    if you say to *add* the hunk, run git apply --cached $tf2
    cat < $tf3 > $tf2
done
rm -f $tmpfile $tf2 $tf3

也就是说,git add -p使用git apply --cached ( git apply --index的一个专门的子变体,它忽略文件的工作树副本)。您需要的关键知识是:文件有三个版本!

  • 第一个(在这里完全被忽略)被冻结了很长时间,在HEAD提交中;第二个是在Git的索引中,也就是分阶段区域。上面的version".
  • The将其用作“工作树中的第三个旧git diff”。git diff将其用作“新版本”.

Git允许您使用或跳过的补丁只是比较“旧”(索引)和“新”(工作树)版本的结果。如果使用某个修补程序,则Git将通过应用修补程序来更新索引副本。

因此,如果工作树版本中有一些行(例如,第100至110行),您希望使用这些行来替换索引版本中的其他一组行(例如,第90行至第92行),即构造方式:

从索引版本中提取出索引version;

  • scrape的第1-89行;从工作树版本中将第100-110行连接起来;从索引版本中将第93行连接到一个临时file;

  • replace --与临时文件一起复制索引。

若要读取索引版本,请使用带有文件索引版本名称的git showgit cat-file -p。如果文件名为path/to/file,则索引版本的名称为:path/to/file (:0:path/to/file的缩写:我们希望在槽0中复制;插槽1、2或3中不能有副本,这样槽0中就有副本;您只需尝试从槽0读取它,如果失败,假设文件不是在索引中,就是冲突)。

读取工作树文件(一些选定的行子集)作为练习,以及连接部分,以及您希望包含的任何错误检查。

假设最终结果文件位于名为$tf的临时文件中(作为shell变量),要更新索引副本,必须首先确保存在适当的blob哈希ID:

代码语言:javascript
复制
hash=$(git hash-object -w -t blob --path="$path" -- "$tf")

例如(这假设您希望运行通常的.gitattribute过滤器(如果有的话),并且知道路径是$path)。然后,如果进展顺利,请在git update-index中使用该散列ID

代码语言:javascript
复制
git update-index --cacheinfo "$mode,$hash,$path"

其中$mode100644100755 (视情况而定)。如果不想更改模式,可以使用git ls-files --cached或类似的方式读取以前的模式。否则,如果core.fileModetrue,则从文件的工作树副本中读取模式,以匹配git add的行为:将“有任何可执行位集”转换为100755,将“无可执行位集”转换为100644。当core.fileModefalse-use git config --get --type bool core.filemode来读取它时,git add使用现有的模式来处理这个添加补丁情况。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74610158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档