访问git污迹过滤器中的文件名和文件内容



我正在编写git污迹过滤器。

.gitconfig

[filter "smudgey"]
smudge = smudge_filter

污点过滤器

#!/usr/bin/env bash
# $Id Date: Wed, Mar 25, 2020  1:41:34 PM, User: Joey Gough, Branch: master$
IFS=
log_string="$Lognhello world"
changed_data=$(sed s/$Log[^$]*/"$log_string"/g $1)
echo $changed_data

过滤文件

$Log$

结果

当我签出这个文件时,它会转换Log标签并插入"helloworld">

$Log
hello world$

情况

当我将.gitconfig重写为:

[filter "smudgey"]
smudge = smudge_filter --smudge %f

它打印出两行换行符,仅此而已。

我已经尝试了很多不同的方法,到目前为止,我似乎无法在Bash脚本中同时访问文件名和文件内容。

问题

如何在git过滤器中同时访问文件内容和文件名?或者我可以吗?

如何访问文件内容。。。

没有文件内容。或者,更好的表达方式是:有内容。它们(尚未(在任何文件中

和文件名同时。。。

您有一个通过%f指令获取文件名的方法。

需要记住的重要一点是文件还不存在1内容将在过滤后进入该文件

如果sed命令执行您想要的操作,请保持sed命令的原样。如果您想将文件名放在某个位置,请分别执行。

这里有一个污点过滤器,它用空格替换fill in the blank,并在顶部插入文件名:

#! /bin/sh
# invoked as "smudge %f" from .gitconfig settings
printf "%sn" "$@"
sed 's/fill in the blank/_________________/'

这里有一个不同的污点过滤器,它用文件名取代__myname__

#! /bin/sh
quoted=$(printf "%s" "$@" | sed -e 's,/,\/,g' -e 's,&,\&,g')
sed "s/__myname__/$quoted/"

(引用技巧是确保$quoted不会扩展到影响sed替代命令的字符:正斜杠是分隔符,与号将被左手边取代。(


1嗯,文件可能存在,也可能不存在。它可能是空的。在你的情况下,它显然确实存在,并且大部分或完全是空的。这里有各种竞争条件,因为过滤是管道的一部分,不同的过程会做不同的事情。

请注意,如果切换到长寿命过滤器,详细信息会发生变化,但总体策略是相同的:要过滤的文本还不在目标文件中。

最新更新