26

由于没有自动化,我将我的点文件存储在 github 中,非常痛苦。我必须自己更新它。

有没有办法可以自动安装/更新/同步点文件?我的意思是在新服务器中,我下载点文件并执行install脚本以将点文件复制到本地。一段时间后,我可以执行一个updateToRemote脚本来将本地更改推送到远程仓库,在另一台服务器上,我可以执行一个updateToLocal脚本来将远程更改拉到本地。

类似的东西。

4

9 回答 9

37

有关点文件的主要信息来源是dotfiles.github.io.

它引用了基于符号链接方法的博客文章,例如Using Git and Github to Manage Your Dotfiles 。

对于初学者,我们将把所有的 dotfiles 放到一个名为 dotfiles 的文件夹中,如下所示/home/smalleycreative/dotfiles/vimrc
然后,我们将简单地从我们的主目录符号链接到它们。


Jaime提到了 Atlassian 教程“存储点文件的最佳方式:裸 Git 存储库

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

于 2013-04-30T06:07:10.903 回答
6

上面的答案非常好,正是我在“真实操作系统”上的做法。

我在使用 cygwin/msys 的知名商业操作系统上遇到了这个问题,因此使用符号链接有时可能会对我最喜欢的一些软件的“本机”端口产生问题。

为了解决这个问题,我尝试直接将文件夹 $HOME 设为 git 存储库。经过一些失败后,我发现关键都在 .gitignore 文件中。

因此,我已经使用了一段时间的设置是通过将 $HOME 作为存储库、创建 .gitignore 文件并单独添加所需的“dotfiles”文件来创建的。我还在备份驱动器(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 repo 忽略,但任何新的 dotfiles 都会显示在 git status 中,例如:

$ 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 子目录存在“怪癖”,但到目前为止没有任何问题。

于 2016-04-11T02:52:11.033 回答
4

好吧,三年过​​去了,没有人想出什么好东西,所以我尝试解决这个问题。它是平台不可知论者和 shell 不可知论者,除了您可用的 bourne 兼容 shell(bash、zsh、ksh 等)之外没有依赖关系。它适用于 mac、linux 和 windows:

点系统

它将自动与 github 和多台机器同步对您的点文件的更改,以及许多其他功能。

于 2016-08-04T02:51:29.567 回答
2

我正在使用 git 存储库 (github) 和 bash 脚本来创建符号链接。但是现在我发现这个工具似乎更强大。看看: https ://github.com/shanx/python-dotfiles 。

于 2014-08-04T20:56:29.550 回答
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

好处

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

更多信息

于 2016-08-01T23:13:21.307 回答
0

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

这种方法已经做了很多工作,所以我建议你检查DFM(dotfiles manager):

于 2015-04-13T16:04:32.083 回答
0

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

好吧,符号链接有效,但它不是将本地文件同步到 git 存储库的最佳方式。有一个更好的解决方案,由 Atlassian 的人编写 – https://www.atlassian.com/git/tutorials/dotfiles

因此,将文件与远程副本同步到 gitbare存储库是最好和最优雅的方式,创建一个 bash 脚本来自动安装和设置。

管理点文件

管理这些点文件的技巧是创建一个裸 git 存储库。如果您从头开始并且之前没有跟踪您的点文件,请在 $HOME 目录中创建一个裸存储库。

git init --bare $HOME/.dotfiles

为了更容易使用,我们将其命名为 dotfiles,我们将使用它而不是常规 git 来与我们的 dotfiles 存储库进行交互。

alias dotfiles="/usr/bin/git --git-dir=$HOME/.dotfiles --work-tree=$HOME"

现在我们可以使用 dotfiles 命令跟踪我们的 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

我也使用这种方式来同步和存储我的 dotfiles,查看我的 dotfiles 存储库,并且可以在Tooling is hard and necessary中阅读我写的关于管理多个设备的 dotfiles 的文章。

于 2021-01-21T12:04:28.257 回答
0

对于裸 git 存储库,我建议使用 git 别名而不是 bash 别名。它集成得更好,因为 git 命令的 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'

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

于 2021-11-12T17:30:02.323 回答
0

痛点:

  1. 我们可能需要将 git-submodules 用于:zsh-plug、vim-plug、coc、tpm(tmux plugins)
  2. 如果符号链接包含 $HOME,并且您有不同的帐户,那就糟了。

参考:

  1. 简单的
    https://www.atlassian.com/git/tutorials/dotfiles
  2. 详细
    https://dotfiles.github.io

我试过了:

  • chezmoi:
    太复杂了!
    我的软链接变成递归的,原因似乎是 chezmoi

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

  • 子树(如复制。“互联网上到处都是关于为什么不应该使用 Git 子模块的文章。使用子树!)

去做

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

子模块使管理 dotfile 依赖关系变得更加容易。如果您厌倦了子模块,很多人更喜欢 git-subtree,它可以让您将子树(其他存储库)合并到一个 Git 存储库中,然后拆分并将更改推送回。

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

于 2022-01-18T02:31:01.180 回答