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
.