나는 그것을 사용하고 있다GNU 스토우내 도트 파일을 다음과 같이 관리하세요이 가이드. 이는 컴퓨터에 기존 도트 파일이 없을 때 효과적입니다. 예를 들어 파일이 없으면 ~/.config/foo.cfg
다음이 제대로 작동합니다.
~/.dotfiles$ mkdir -p foo/.config
~/.dotfiles$ echo My config > foo/.config/foo.cfg
~/.dotfiles$ stow foo
~/.dotfiles$ ls -l ~/.config
lrwxrwxrwx 1 user group 21 Dec 6 19:03 ~/.config -> .dotfiles/foo/.config
~/.config/foo.cfg
이미 존재하는 경우 덜 단순해집니다.
~/.dotfiles$ stow foo
WARNING! stowing bar would cause conflicts:
* existing target is neither a link nor a directory: foo.cfg
All operations aborted.
지금까지 내가 찾을 수 있었던 유일한 해결책은 .dot 파일을 수동으로 삭제 ~/.config/foo.cfg
하고 다시 실행하는 것입니다 stow foo
. stow를 사용하여 포인트 파일을 관리하는 목적.
스토우에게는 --adopt
선택권이 있었습니다. 이 작업의 효과는 저장된 파일을 stow --adopt foo
컴퓨터에 있는 foo
기존 파일로 바꾼 다음 심볼릭 링크를 생성하는 것입니다. foo
내가 찾고 있는 것은 반대 효과를 얻는 방법입니다. 머신의 .dotfiles를 stash 버전에 대한 심볼릭 링크로 대체하여 Git 저장소의 stash dot 파일을 사용하여 새 머신을 프로비저닝할 수 있습니다.
이는 Stow를 사용하여 포인트 파일을 관리하기 위한 당연한 요구 사항인 것 같습니다. 뭔가 빠졌거나 문제가 이미 해결된 것 같은 느낌이 듭니다.
어떤 아이디어가 있나요?
답변1
나는 동일한 제한에 부딪혔고 --adopt
이 옵션과 잘 작동하는 작업 흐름을 찾았습니다. 에서 언급했듯이문서 저장:
...대상 트리의 파일(내용은 stow 패키지 설치 이미지의 해당 버전과 다를 수 있음)을 패키지에 적용한 다음 stow 패키지 내에서 "git diff..."와 같은 명령을 실행합니다. 내용이 비교되고 마지막으로 유지되거나(예: "git commit ..."을 통해) 삭제됩니다("git checkout HEAD ...").
내 작업 흐름:
stow
이 옵션을 사용하여 실행하세요--adopt
.- .을 사용하여 "채택된" 파일을 내 저장소의 원본 파일과 비교하세요
git diff
. git reset --hard
전체 디렉터리를 마지막 커밋된 상태로 복원하려면 "채택된" 파일로 인해 발생한 모든 변경 사항 삭제를 사용하세요 .
예:
# Running from inside .dotfiles repository
❯ tree . -a
.
├── bash
│ ├── .bashrc
│ └── .xprofile
# Stow bash folder as usual and note conflicts (.bashrc in this case)
❯ stow bash
WARNING! stowing bash would cause conflicts:
* existing target is neither a link nor a directory: .bashrc
All operations aborted.
e conflicts
# Rerun Stow with --adopt flag to place conflicting files in .dotfiles repo (no warnings)
❯ stow bash --adopt
# Use git diff to compare adopted and committed file
❯ git diff
diff --git a/bash/.bashrc b/bash/.bashrc
index cbd6843..0ac2879 100644
--- a/bash/.bashrc
+++ b/bash/.bashrc
@@ -1,121 +1 @@
... Line changes are listed ...
# Discard adopted file and revert back to contents as per last commit
❯ git reset --hard
# Done
나는 dotfiles와 Stow를 처음 접했기 때문에 몇 가지 제한 사항이 누락되었을 수 있습니다. 지금까지의 결과에 만족합니다.
답변2
나는 같은 문제에 직면했다. 저는 개인적으로 Ansible을 사용하여 모든 GNU Stow 명령을 자동화합니다. Ansible 스크립트가 귀하의 요구 사항에 정확히 맞지 않을 수도 있지만, 제 접근 방식은 다양한 옵션을 탐색하는 데 도움이 될 수 있습니다. 아래에 작성된 Ansible 플레이북에서 쉘 명령을 변경하여 bash에서 유사한 스크립트를 작성할 수 있습니다.
내 dotfile 폴더는 다음과 같이 구성됩니다. "~/dotfiles/home/"에는 "bash" 및 "zsh"와 같은 하위 폴더 이름이 포함되어 있습니다. 이 코드 조각에서 dotfile_packages = "~/dotfiles/home/"
이는 많은 수의 파일을 무인으로 삭제하므로 안전하지 않은 방법이라는 점을 명심하세요.
- name: Find all dotfiles subfolders
find:
paths: "{{ dotfile_packages }}"
file_type: directory
recurse: no
register: dotfile_folders
- name: Get list of dotfiles to check for GNU Stow conflicts
shell: find ./home/{{ item }} \( -type f -o -type l \) | sed 's/.\/home\/{{ item }}\///g'
args:
chdir: "{{ repo_dir }}"
register: conflict_files
with_items: "{{ dotfile_folders.files | map(attribute='path') | list | map('basename') }}"
- name: Show list of files to be checked for GNU Stow conflicts
debug:
msg: "{{ item }}"
with_items: "{{ conflict_files.results | map(attribute='stdout_lines') | list | flatten }}"
# If we don't unstow first, the delete operation erases any previously stowed dotfile sources.
# Ignoring errors because sometimes unstow will fail to finish because OS added some untracked files.
- name: Unstow all packages deleting conflict files.
shell: stow -D -d {{ dotfile_packages }} -t ~/ {{ item }}
with_items: "{{ dotfile_folders.files | map(attribute='path') | list | map('basename') }}"
ignore_errors: yes
- name: Delete conflicting files
shell: rm -rf ~/{{ item }}
with_items: "{{ conflict_files.results | map(attribute='stdout_lines') | list | flatten }}"
- name: Symlink dotfiles
shell: stow -d {{ dotfile_packages }} -t ~/ {{ item }}
with_items: "{{ dotfile_folders.files | map(attribute='path') | list | map('basename') }}"
답변3
나는 stow 사용법을 다음과 같이 포장하여 이 작업을 수행했습니다.파일 생성(백업 대상 확인)
# List of packages to manage with stow
PACKAGES ?= $(filter-out .git .github, $(wildcard */))
# Directory where stow will look for packages. Default is current directory
DIR ?= $$(pwd)
# Default location where stow will create symbolic links
TARGET ?= ${HOME}
IGNORE ?= \.DS_Store
# Stow command to create links
STOW_CMD = stow \
--dir="${DIR}" \
--target="${TARGET}" \
--ignore="${IGNORE}" \
--ignore="\.DS_Store" \
--ignore=".*\.template" \
--no-folding \
--verbose
# Function to backup existing files for a specific package if they exist
define backup_if_exists
checks=$$(${STOW_CMD} --no --verbose ${1} 2>&1 | \
egrep '\* existing target is ' | \
sed 's/ \* existing target is neither a link nor a directory: //'); \
for file in $$checks; do \
filepath=${TARGET}/$$file; \
backup_suffix="backup-$$(date -u +%Y%m%d%H%M%S)"; \
echo "Creating backup $$filepath.$$backup_suffix"; \
mv -h "$$filepath" "$$filepath.$$backup_suffix"; \
done
endef
# Default rule to create symbolic links for all packages
all: stow
# Rule to backup existing configurations
backup:
@echo "Checking for existing files to backup..."
@$(foreach package,$(PACKAGES), \
$(call backup_if_exists,$(package));)
# Rule to link configurations using stow
stow: backup
@echo "Applying stow for packages..."
@$(foreach package,${PACKAGES}, \
$(STOW_CMD) ${package};)
# Rule to remove symbolic links
unstow:
@echo "Removing stow links for packages..."
@$(foreach package,$(PACKAGES), \
$(STOW_CMD) -D $(package);)
# Rule to reapply symbolic links
restow: backup unstow stow
# Rule to display help
help:
@echo ""
@echo "\033[1mUSAGE\033[0m"
@echo ""
@echo " make [target]"
@echo ""
@echo "\033[1mTARGETS\033[0m"
@echo ""
@echo " stow - Create symlinks for all packages (default)"
@echo " restow - Reapply symlinks for all packages"
@echo " unstow - Remove symlinks for all packages (\033[31mcaution\033[0m)"
@echo " help - Show this help message"
@echo ""
.PHONY: all backup stow unstow restow help
이 Makefile의 기능은 무엇입니까?
- 처음으로 체크 모드 시작접기
- 기존 프로젝트 나열
- 백업 파일
- 발사 후퇴
USAGE
make [target]
TARGETS
stow - Create symlinks for all packages (default)
restow - Reapply symlinks for all packages
unstow - Remove symlinks for all packages (caution)
help - Show this help message
답변4
나는 같은 문제에 직면했습니다. 다음은 시도한다고 가정할 때 간단한 해결책입니다 stow config
.
stow config
# WARNING! stowing config would cause conflicts:
# ...
# All operations aborted.
rsync -a config/ config.bak/ # create a backup; this may not be exactly the right rsync syntax
stow --adopt config.bak # should take ownership of all existing files
stow -D config.bak # remove all the symlinks just created
stow config # should now work fine
rm -rf config.bak