考虑这个脚本。
#! /usr/bin/env bash
mkdir -p target
mkdir -p mydir/package/
touch mydir/package/file
ln --symbolic mydir mylink
file mylink
stow --verbose --dir=./mylink --target=./target package
file target/file
Run Code Online (Sandbox Code Playgroud)
输出是
mylink: symbolic link to mydir
LINK: file => ../mydir/package/file
target/file: symbolic link to ../mydir/package/file
Run Code Online (Sandbox Code Playgroud)
在运行之前stow
,它看起来像这样:
.
??? mydir
? ??? package
? ??? file
??? mylink -> mydir
??? target
Run Code Online (Sandbox Code Playgroud)
运行stow
, on 后mylink
,我希望它看起来像这样:
.
??? mydir
? ??? package
? ??? file
??? mylink -> mydir
??? target …
Run Code Online (Sandbox Code Playgroud) 让我们假设一个名为scripts
.
??? scripts
? ??? .scripts
? ??? script1
? ??? script2
? ??? script3
? ??? .config
? ??? script4
? ??? script5
? ??? script6
Run Code Online (Sandbox Code Playgroud)
使用时stow scripts
,其中的两个文件夹都scripts
将符号链接到~/.scripts
和~/.config
。
我可以使用 stow 仅符号链接.scripts
而不必.config
从文件夹中删除但基本上忽略它吗?
我按照本指南使用GNU Stow来管理我的点文件。这对于机器上没有预先存在的点文件的情况非常有效。例如,如果没有文件,则以下内容可以正常工作:~/.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
Run Code Online (Sandbox Code Playgroud)
~/.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.
Run Code Online (Sandbox Code Playgroud)
到目前为止,我能找到的唯一解决方案是手动删除~/.config/foo.cfg
并重新运行stow foo
. 当向可能有数十个预先存在的 .dot 文件的新计算机配置 stow 存储库时,这是相当尴尬的,并且基本上违背了使用 stow 管理点文件的目的。
斯托有--adopt
选择权。运行的stow --adopt foo
效果是用计算机上 …
我必须做什么才能stow
正确链接二进制文件(也许还有手册页)?
我想使用 GNUstow
来管理我机器上的本地安装。但是,stow
不会简单地对二进制文件进行符号链接,而是对程序文件夹中的所有文件进行符号链接。到目前为止我做了什么:
src/
除二进制文件以外的所有文件所在的子文件夹,并手动更改 Makefile 以创建bin/
子文件夹。然后稍后删除链接的local/src/
文件夹我想一定有更好的方法,但我用stow
错了。
例子
文件夹结构
~home/
|~local/
|+bin/ <-- binarys should go here
|+share/ <-- man page
|~stow/
|-.stowrc
|~dwm-6.0/
|-Makefile
|-dwm.c
|-dwm.h
|-dwm
|-config.mk
|-README
|~hub-1.11/
|~bin/
|-hub
|+etc/
|+feature/
|+githook/
|+lib/
|-Gemfile
|-Rakefile
|-hub.gemspec
Run Code Online (Sandbox Code Playgroud)
从这里我将进入stow/
文件夹类型
stow dwm-6.0
Run Code Online (Sandbox Code Playgroud)
然后平放链接的所有文件复制到local/
文件夹,而不是只有二进制dwm
到local/bin/
文件夹中。我现在可以更改Makefile
它,以便它创建一个dwm-6.0/bin/
文件夹并将二进制文件移动到那里。然后stow
至少会链接dwm
到local/bin/ …
--ignore=<regex>
我放入的行.stowrc
不起作用。运行 Stow 时,它显示“从 .stowrc 加载默认值”,但它没有任何效果。但是将--ignore=<regex>
行传递给命令直接有效。
假设这个目录:
user@user-machine:~/test-stow/stow$ tree -a
.
??? a
? ??? car
??? .stowrc
1 directory, 2 files
Run Code Online (Sandbox Code Playgroud)
内容./.stowrc
:
--ignore='car'
Run Code Online (Sandbox Code Playgroud)
所以我的期望是,stow --verbose=3 a/
在该目录中运行命令等同于stow --ignore='car' --verbose=3 a/
在./.stowrc
文件不存在的情况下运行。
现在我运行:
user@user-machine:~/test-stow/stow$ stow --verbose=3 a
Loading defaults from .stowrc
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在版本控制下管理我的点文件。我的 dotfiles 存储库包含一个xfce-base
文件夹,该文件夹包含.config/xfce4/.../xy-setting.xml
内容。我可以将符号链接或更好地存放到正确的位置,一切都按预期工作。
但是,当我打开其中一个 xfce 设置编辑器(窗口管理器、键盘快捷键)时,所做的更改确实用普通文件覆盖了我的符号链接。所以,再见版本控制。我想这不会发生,如果我有硬链接,对吗?是否可以使用 gnu stow 进行硬链接(看起来不是这样?),还是有其他选择?
编辑:我遇到了这个,有硬链接,但不能递归地工作(抱怨现有的 .config 目录......)
编辑二:我仍然不确定硬链接是否是一个好的解决方案。