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

おすすめ記事