请解释Tim Pope';使用Git轻松实现CTAG

请解释Tim Pope';使用Git轻松实现CTAG,git,unix,ctags,Git,Unix,Ctags,只是安装蒂姆·波普在这里。解释起来有点简单。我知道大概的意思,但有人能解释一下细节吗?具体而言: trap 'rm -f "$dir/$$.tags"' EXIT 为什么要通过陷阱删除此文件,而不是每次运行脚本时都删除 git ls-files | \ ctags --tag-relative -L - -f"$dir/$$.tags" --languages=-javascript,sql mv "$dir/$$.tags" "$dir/tags" 为什么要将标签文件放入一个临时

只是安装蒂姆·波普在这里。解释起来有点简单。我知道大概的意思,但有人能解释一下细节吗?具体而言:

trap 'rm -f "$dir/$$.tags"' EXIT 
为什么要通过陷阱删除此文件,而不是每次运行脚本时都删除

git ls-files | \
    ctags --tag-relative -L - -f"$dir/$$.tags" --languages=-javascript,sql
mv "$dir/$$.tags" "$dir/tags"

为什么要将标签文件放入一个临时变量
$$.tags
,然后将其移动到下一行的
标签中?

答案都在注释中。我希望可以在回答中重申这些评论,这样这个问题就可以标记为“已回答”

为什么要通过陷阱删除此文件,而不是每次运行脚本时都删除

我认为这是对的。请注意,Pope先生正在使用
set-e
,因此如果
git
mv
失败,脚本将立即退出。如果他只是将
rm
放在脚本的末尾,而不是放在
陷阱中,那么如果在到达
rm
之前有任何命令失败,您可能会在周围乱扔
*.tags
文件。我喜欢使用
陷阱。。。退出
以清理临时文件

为什么要将标记文件放入临时变量$$.tags中,然后将其移动到下一行的标记中

这里我认为是正确的:您可能不希望您的编辑器/IDE尝试使用半写的标记文件。最好让可能冗长的标签重建完成,并在一次原子移动中将整个数据库移动到位。(请不要对
重命名(2)
的原子性发表评论!)


另外,如果您签出一个分支,然后在第一个
ctags
命令完成之前签出另一个分支,该怎么办?虽然他的脚本不会阻止多次将
ctag
触发到后台,但写入
$$.tags
至少可以确保最后一次完成的
ctag
将生成一个完整(如果不合理)的tags文件。与之相比,多个
CTAG
同时处理所有写入单个
标记的过程,我打赌这会给您留下一个无效的数据库。

标记
技巧可能是为了保证您永远不会看到部分
标记
文件;旧的在新的完成之前保持不变。我没有第一部分的答案。第一部分是确保如果Git在脚本中间崩溃,就永远不会有一个“左”部分标签文件。