如何使用Github管理dotfiles?

27

我把我的dotfiles存储在Github上,但没有自动化,所以非常费劲。我必须亲自更新它。

是否有一种方法可以自动安装/更新/同步dotfiles? 我的意思是,在新的服务器上,我可以下载dotfiles并执行一个install脚本将dotfiles复制到本地。过了一段时间后,我可以执行updateToRemote脚本将本地更改推送到远程仓库,在另一个服务器上,我可以执行updateToLocal脚本将远程更改拉取到本地。

类似这样的东西。

10个回答

39

关于 dotfiles 的主要信息来源是 dotfiles.github.io

它引用了类似「使用Git和Github管理您的Dotfiles」的博客文章,基于符号链接方法。

首先,我们将把所有的dotfiles放到一个名为dotfiles的文件夹中,就像这样:/home/smalleycreative/dotfiles/vimrc
然后,我们只需从我们的主目录中创建符号链接即可。


Jaime 提到 Atlassian 的教程 "存储 dotfiles 的最佳方式:一个裸的 Git 存储库"

该技术的原理在于在一个“侧”文件夹(如 $HOME/.cfg$HOME/.myconfig)中存储一个 Git 裸存储库,并使用特别制作的别名使命令针对该存储库而不是通常的 .git/ 本地文件夹运行,这会干扰周围任何其他 Git 存储库。
(然后 dotfiles 文件夹被管理为一个 git 存储库)


有没有已知的解决方案可以在更改后自动同步点文件,就像点文件是云中共享文件一样?我不喜欢每次更改设备时都要推送和拉取更改。如果没有类似的解决方案,我可以自己实现一个。 - ElefEnt
@ElefEnt 我所了解的大多数解决方案都在https://dotfiles.github.io/中列出。其中一些包括一个rsync脚本。关于这个主题,你还可以在https://www.reddit.com/r/linux/comments/ctlp3/methods_for_keeping_dotfiles_in_sync_across/找到其他讨论。 - VonC
Atlassian有一篇关于[使用git工作树而不是符号链接](https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/)的教程。 - Jaime
@Jaime 谢谢你。我已经将你的评论包含在答案中,以增加其可见性。 - VonC

6
上面的答案非常出色,这正是我在“真实操作系统”上的做法。
在使用cygwin/msys的知名商业操作系统上,使用符号链接可能会在一些我最喜欢的软件的“本地”端口中出现问题。
为了解决这个问题,我尝试直接将文件夹$HOME作为一个git存储库。经过一些失败的尝试,我发现关键在于.gitignore文件。
因此,我使用已创建的$HOME存储库,创建了一个.gitignore文件,并单独添加了所需的“点文件”。我还添加了一个备份驱动器上的存储库(在这种情况下为z:),以获得自动备份。如果你的文件夹已经备份好了,添加一个上游就是一个不必要的复杂化。因此,假设“/z/Backups/Dotfiles.git”是一个预先存在的“裸”存储库,在msys shell中,设置步骤如下:
$ cd $HOME
$ git init
Initialised empty Git repository in $HOME
$ git add .bashrc .emacs .gitconfig # for example
$ git commit -m "Initial import of dotfiles"
[master (root-commit) xxxxxxxx] Initial import for dotfiles
 3 files changed, xxx instertions(+)
 create mode 100644 .bashrc
 create mode 100644 .emacs
 create mode 100644 .gitconfig

# The following two lines just add an "upstream" purely for backup purposes.
$ git remote add origin /z/Backups/Dotfiles.git
$ git push -u origin master
<< snip >>

接下来,我将以下内容放入$HOME/.gitignore文件中:

# First exclude everything.
*
# then re-include all "dotfiles"
!/.*
# then a bunch of specific excludes as they are more-or-less "cache" data rather than configuration.
/.bash_history
/.dbus-keyrings/
/.emacs.d/
/.gimp-2.8/
/.git/
/.gitk
/.idlerc/
/.lesshst
/.saves/
/.thumbnails/

最后,以下命令(抱歉我没有捕获这些命令的输出)将 .gitignore 文件本身添加到版本库中:
$ cd $HOME
$ git add .gitignore
$ git commit -m "Added some rules so git status on the dotfiles is useful."
$ git push

现在你添加到主目录的“普通”文件将被忽略 dotfiles 存储库,但任何新的 dotfiles 将出现在 git 状态中,例如:
$ cd $HOME
$ touch NewFile.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean

$ touch .funkychicken
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .funkychicken

nothing added to commit but untracked files present (use "git add" to track)

到目前为止,这个方法一直运作良好,即使有些子目录是它们自己(无关)的Git仓库。有时候非Git子目录会出现一些“怪癖”,但目前还没有出现任何问题。


4

三年过去了,没有人想出什么好办法来解决这个问题,所以我尝试着解决它。这个方案不依赖于平台和shell类型,除了你可用的Bourne兼容Shell(如bash、zsh、ksh等),没有其他的依赖。它可以在Mac、Linux和Windows上运行:

Dotsys

Dotsys会自动将您的点文件与GitHub和多台计算机同步,还有许多其他功能。


2

1
我发现一种有趣的方法,可以使用普通的git管理你的点文件,不需要符号链接。这样,你应该能够像往常一样进行推送和拉取:
设置
git init --bare $HOME/.myconf
alias config='/usr/bin/git --git-dir=$HOME/.myconf/ --work-tree=$HOME'
config config status.showUntrackedFiles no

我的~/.myconf目录是一个git裸仓库。
用法:
然后可以使用git别名执行常规的git命令,例如config或您选择的任何命令。
config status
config add .vimrc
config commit -m "Add vimrc"
config push

好处

  • 无需额外工具
  • 无需符号链接

更多信息


0
我曾经遇到过同样的问题,对于裸仓库的方法并不是很满意。因此,我创建了dotfile_manager这个工具,它可以自动设置符号链接到所有点文件的正确位置。此外,它还允许您安装所有必要的依赖项。
只需使用:
$ dotfile_manager install
$ dotfile_manager setup

0

我也在寻找一种以最少的步骤设置新机器的方法,花了一些时间后,我发现几乎所有开发人员都使用git来存储和共享这些文件,并使用符号链接将它们同步。

好吧,符号链接可以工作,但这并不是将本地文件同步到git仓库的最佳方式。有一个更好的解决方案,由Atlassian的人编写 - https://www.atlassian.com/git/tutorials/dotfiles

因此,对于git bare仓库而言,这是将您的文件与远程副本同步的最佳且最优雅的方式,创建一个bash脚本来自动安装和设置。

管理dotfiles

管理这些dotfiles的诀窍是创建一个裸的git仓库。如果您从头开始并且以前没有跟踪过您的dotfiles,请在$HOME目录中创建一个裸仓库。

git init --bare $HOME/.dotfiles

为了更方便使用,我们将别名设置为 dotfiles,以代替常规的 git 与我们的点文件存储库进行交互。
alias dotfiles="/usr/bin/git --git-dir=$HOME/.dotfiles --work-tree=$HOME"

现在我们可以使用dotfiles命令来跟踪我们的点文件,以下是一些示例:

# to check the version history 
dotfiles log

# to check the status of the tracked and untracked files 
dotfiles status

# to add a file for tracking
dotfiles commit .vimrc -m ".vimrc added"

# push new files or changes to the github
dotfiles push origin main

我也使用这种方法同步和存储我的点文件,请查看我的点文件存储库,并可以在使用Git存储点文件-这是最佳方法中阅读,其中我写了关于为多个设备管理点文件的文章。


0

对于裸的 Git 仓库,我建议使用 Git alias 而不是 Bash alias。这样可以更好地集成,因为 Git 命令的自动补全仍然能够正常工作:

git init --bare ~/dotfiles.git
git config --global alias.dotfiles '!git --git-dir=$HOME/dotfiles.git/ --work-tree=$HOME'

它的使用方式如下:

git dotfiles add .gitconfig
git dotfiles commit -m 'Add gitconfig'

这篇博文中有一些进一步的信息。


0

主要思想是创建一个单独的目录(通常称为.dotfiles),其中包含您想要在git中跟踪的所有真实dotfiles,并在主目录中使用符号链接。

已经有很多工作针对这种方法完成了,因此我建议您检查DFM(dotfiles管理器):


0

问题:

  1. 我们可能需要使用 git-submodules 来管理:zsh-plug、vim-plug、coc 和 tpm(tmux 插件)
  2. 如果符号链接包含 $HOME,并且您有不同的帐户,会遇到问题。

参考资料:

  1. simple
    https://www.atlassian.com/git/tutorials/dotfiles
  2. detailed
    https://dotfiles.github.io

我已经尝试过:

  • chezmoi:
    太复杂了!
    我的软链接变成了递归,看起来是chezmoi引起的。

  • 子模块(像软链接。vim-plug使用子模块管理插件)

  • 子树(像复制。"互联网上充满了关于为什么不应该使用Git子模块的文章。使用子树!)

待办事项

https://dotfiles.github.io/tips/

子模块使得管理点文件依赖变得更加容易。如果你对子模块感到厌烦,许多人更喜欢使用 git-subtree,它可以让你将子树(其他仓库)合并到一个 Git 仓库中,然后再拆分和推送更改。

https://www.atlassian.com/git/tutorials/git-subtree


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接