我正在寻找一种简单的方法来备份 git 存储库中的所有点文件。
我的目标解决方案:
- 将 git 作为我的点文件内容的真实来源
- 在我的主目录中,备份文件将是存储库中文件的符号链接(因此,当我编辑它时,它将在存储库中进行编辑)
- 我可以使用一个命令为存储库中的所有文件创建符号链接(目录结构将被保留,但只应链接文件
例如,我有这个备份存储库结构:
.config
|_ nvim
|_ init.lua
.tmux
|_ tmux.conf
.zshrc
我想从中得到这个结构:
home
|_ .config
| |_ (other contents)
| |_ nvim
| |_ (other contents)
| |_ link to init.lua
|_ .tmux
| |_ (other contents)
| |_ link to tmux.conf
|_ link to .zshrc
|_ (other home files and directories)
其他内容在备份过程开始之前可能存在,不应备份或受备份过程影响
令我惊讶的是,我无法找到现有的解决方案。我认为rsync
可以,但谷歌搜索没有给出如何做到这一点的答案。我试图破解一个简单的 bash 脚本,但淹没在测试和大量边缘情况中(即对于每个目录ignore .
,..
and .git
,递归到子目录等)
我确信应该有一个实用程序可以做到这一点。也许有人可以帮我指出来?或者已经有一个脚本可以做到这一点?
更新:
使用 Stéphane 的评论中的想法来使用cp
我编写了这个脚本,它完全涵盖了我的用例:
find ./dotfiles -maxdepth 1 -mindepth 1 | xargs realpath | xargs -i cp {} $HOME -rs --remove-destination
答案1
创建要在 Git 下跟踪的符号链接时有一个重要的警告。源文件的引用路径应该是相对于存储库的,而不是绝对于机器的。
不适合 Git 存储库
ln -s /Users/gio/repo/foo.md ./bar/foo.md
适合 Git 存储库
cd ./bar && ln -s ../foo.md foo.md
这就是你想要的,
制作一个目录,即备份
mkdir backup
然后cd backup
然后将其设为 git 存储库git init
(可选为您的配置创建一个文件夹)
之后做ln -s /path/to/file/
然后测试它git add .
git commit "test a symlink"
git push
完成后编辑文件,重新 git commit/push
现在,您可以更新文件,文件将会正确更新,并且 GitHub 也会很好地呈现它。