【发布时间】:2014-10-01 00:12:43
【问题描述】:
在我的 Mac 根目录下,我有我的 .bashrc、.aliases、.zshrc...,然后在另一个文件夹中,我有一个相同点文件的 git 存储库。当我更新根目录时,我也会(手动)更新 git repo。有没有办法将根文件夹中实际实现的点文件“链接”到 git repo,这样我只需要处理一个更改?
【问题讨论】:
在我的 Mac 根目录下,我有我的 .bashrc、.aliases、.zshrc...,然后在另一个文件夹中,我有一个相同点文件的 git 存储库。当我更新根目录时,我也会(手动)更新 git repo。有没有办法将根文件夹中实际实现的点文件“链接”到 git repo,这样我只需要处理一个更改?
【问题讨论】:
只需删除根目录中的文件,然后将它们重新创建为
ln -s /physical/path/to/file /symbolic/link/path
例如,如果您有文件 /git/.aliases,ln -s /git/.aliases /root/.aliases 将在 root 文件夹中创建一个名为 .aliases 的符号链接。从此时起,无论您修改哪个文件(/git 或 /root),都会同时修改另一个文件。
查看this link,了解有关符号链接和 Mac 的更多详细信息。
请原谅我的随机路径,我不是 Mac 用户。
【讨论】:
您实际上可以使用ln“链接”这些文件。您可以使用符号链接 (-s) 或硬链接。如果您使用 UNIX(如系统),您应该了解链接。
符号链接是包含路径(相对或绝对)的基本特殊文件,系统会将它们视为该路径上的文件(这意味着符号链接可能会损坏)。
硬链接(由ln 创建,没有-s 标志)仅限于单个文件系统,硬链接只是与原始文件相同的字节块的名称。硬链接与原始文件无法区分。实际上,文件只是计数为 1 的硬链接(=inode 的名称)。(ls -l 列表中的第二列显示给定文件的文件系统上存在的硬链接(名称)的数量。)
我还把我的点文件放在了一个 repo 中。在我的回购中。我在名为payload 的目录中有点文件,我的仓库还包含一个将payload 中的dotfiles 链接到我的主目录的脚本。
脚本如下:
#!/bin/bash
shopt -s dotglob #make globbing catch dotfiles too
#Use -f (force) to overwrite targets
for file in payload/*; do ln -s .${PWD/$HOME/}/$file $HOME/; done #use string substitution
编辑
我发现在链接中获取相对路径的一种更简单的方法是使用-r 选项到ln:
for file in payload/*; do ln -s -r $file $HOME/; done
您还可以使用ln 的第三种形式一次创建多个链接(请参阅man ln):
ln -s -r payload/* $HOME/
对于硬链接版本,您可以这样做:
#!/bin/bash
shopt -s dotglob #make globbing catch dotfiles too
ln payload/* $HOME/
(此硬链接版本不会因移动和重命名而损坏,但您的 repo 必须位于同一文件系统上)
(所有这些都假设您在payload/ 中只有文件(而不是目录),并且您的链接应该与其目标具有相同的名称。)
有更复杂的程序以更强大的方式执行此操作。
【讨论】:
我通常为此使用符号链接,例如:
mkdir ~/.dotfiles
mv ~/.zshrc ~/.dotfiles
ln -s ~/.dotfiles/.zshrc ~/.zshrc
cd ~/.dotfiles ; git init ; ...etc...
..这样实际打开的文件是您的 ~/.dotfiles 目录中受版本控制的文件。
另一种选择是使用特定于应用程序的“包含”功能,例如:
~/.dotfiles/.zshrc
从~/.zshrc获取该文件:
[ -e ~/.dotfiles/.zshrc ] && . ~/.dotfiles/.zshrc
【讨论】: