我希望能够在特定的代码行中匹配一个模式(在我的例子中是MARKETING_VERSION)。
我得到了awk命令,它将显示与模式MARKETING_VERSION匹配的行,但我不知道如何将从该结果到git的行划分。
awk '/MARKETING_VERSION/{print NR}' exampleFile.txt终端中的结果是
1191
1245如何使用此结果将该文件中的特定行划分为git?
我知道您可以使用git add -p,但是我想在shell脚本中使用它,所以我需要一个非交互式版本。
提亚
发布于 2022-11-29 10:50:33
粗略地说,git add -p <file>所做的是:
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".git diff”。git diff将其用作“新版本”.Git允许您使用或跳过的补丁只是比较“旧”(索引)和“新”(工作树)版本的结果。如果使用某个修补程序,则Git将通过应用修补程序来更新索引副本。
因此,如果工作树版本中有一些行(例如,第100至110行),您希望使用这些行来替换索引版本中的其他一组行(例如,第90行至第92行),即构造方式:
从索引版本中提取出索引version;
若要读取索引版本,请使用带有文件索引版本名称的git show或git cat-file -p。如果文件名为path/to/file,则索引版本的名称为:path/to/file (:0:path/to/file的缩写:我们希望在槽0中复制;插槽1、2或3中不能有副本,这样槽0中就有副本;您只需尝试从槽0读取它,如果失败,假设文件不是在索引中,就是冲突)。
读取工作树文件(一些选定的行子集)作为练习,以及连接部分,以及您希望包含的任何错误检查。
假设最终结果文件位于名为$tf的临时文件中(作为shell变量),要更新索引副本,必须首先确保存在适当的blob哈希ID:
hash=$(git hash-object -w -t blob --path="$path" -- "$tf")例如(这假设您希望运行通常的.gitattribute过滤器(如果有的话),并且知道路径是$path)。然后,如果进展顺利,请在git update-index中使用该散列ID
git update-index --cacheinfo "$mode,$hash,$path"其中$mode为100644或100755 (视情况而定)。如果不想更改模式,可以使用git ls-files --cached或类似的方式读取以前的模式。否则,如果core.fileMode是true,则从文件的工作树副本中读取模式,以匹配git add的行为:将“有任何可执行位集”转换为100755,将“无可执行位集”转换为100644。当core.fileMode是false-use git config --get --type bool core.filemode来读取它时,git add使用现有的模式来处理这个添加补丁情况。)
https://stackoverflow.com/questions/74610158
复制相似问题