运行 GNU Stow 之前删除所有目标链接和文件

运行 GNU Stow 之前删除所有目标链接和文件

如果目标文件已存在,GNU Stow 将无法正常运行。因此,我编写了一个脚本,该脚本将首先删除目标中的所有文件和链接,然后运行 ​​Stow。

#!/bin/bash

fd --hidden --ignore-file .gitignore --base-directory="$HOME/.dotfiles/.common-dotfiles" --type l --type f | sd ^. $HOME | xargs -I{} rm {}
stow --no-folding --target="$HOME" --dir="$HOME/.dotfiles" --restow .common-dotfiles

但我的直觉告诉我这不是一个好主意。我在这里缺少什么?运行这个脚本有什么风险吗?我该如何改进这个脚本?

更新1:

GNU Stow 在目标中创建源目录结构的精确副本。所以,我首先获取源代码的目录结构。更改路径以匹配目标。然后运行xargs -I{} rm {}它。

我已经破坏了下面管道的输出。

首先,我搜索目录中的所有文件$HOME/.dotfiles/.common-dotfiles

% fd --hidden --ignore-file .gitignore --base-directory="$HOME/.dotfiles/.common-dotfiles" --type l --type f
.config/VSCodium/User/globalStorage/alefragnani.project-manager/projects.json
.config/VSCodium/User/globalStorage/state.vscdb
.config/VSCodium/User/keybindings.json
.config/VSCodium/User/settings.json
.config/VSCodium/User/snippets/c.json
.config/VSCodium/User/snippets/custom-snippets.code-snippets
.config/VSCodium/product.json

现在我正在使用管道传输上一个命令的输出来修改路径以sd ^. $HOME匹配目标目录。

% fd --hidden --ignore-file .gitignore --base-directory="$HOME/.dotfiles/.common-dotfiles" --type l --type f | sd ^. $HOME
/home/ismail/.config/VSCodium/User/globalStorage/alefragnani.project-manager/projects.json
/home/ismail/.config/VSCodium/User/globalStorage/state.vscdb
/home/ismail/.config/VSCodium/User/keybindings.json
/home/ismail/.config/VSCodium/User/settings.json
/home/ismail/.config/VSCodium/User/snippets/c.json
/home/ismail/.config/VSCodium/User/snippets/custom-snippets.code-snippets
/home/ismail/.config/VSCodium/product.json

所以,现在我不再删除 中的文件,$HOME/.dotfiles/.common-dotfiles而是删除$HOME.

答案1

我已经做了一些研究并在其中找到了答案文档

' - 采纳'

警告!此行为专门用于更改存放目录的内容。如果您不希望这样,那么此选项不适合您。

当装载时,如果遇到一个已经存在但是普通文件的目标(因此不属于任何现有的装载包),那么通常 Stow 会将其注册为冲突并拒绝继续。此选项会更改该行为,以便将文件移动到存储目录中程序包安装映像内的相同相对位置,然后像以前一样继续存储。因此,该文件实际上被 stow 包采用,而其内容却没有改变。

当 stow 包受版本控制系统控制时,这特别有用,因为它允许目标树中的文件(其内容可能与 stow 包的安装映像中的等效版本不同)被采用到包中,然后通过在 stow 包中运行类似“git diff ...”的内容进行比较,最后要么保留(例如通过“git commit ...”)或丢弃(“git checkout HEAD ...”)。

所以,我应该做的是:

git checkout HEAD
stow --adopt --stow .common-dotfiles
git checkout HEAD
stow --restow .common-dotfiles

如果我们需要保留一些更改,那么我们可以运行,并在命令git diff后解决合并冲突。stow --adopt

在上面的命令中我使用restore .而不是checkout HEAD.

相关内容