【问题标题】:Efficient way to manage a git repository for local config files管理本地配置文件的 git 存储库的有效方法
【发布时间】:2013-06-09 13:00:02
【问题描述】:

我将我的配置文件(~/.bashrc~/.emacs~/emacs 等)存储在 git 中。我配置它的方式只是在主目录中添加一个 git 存储库。

我发现这种方法有一些问题:

  • git gui 需要很长时间,因为它递归地扫描整个主目录。
  • 我有时会不小心将文件添加到配置存储库中,这些文件应该转到新存储库(我创建了一个新项目,例如在 ~/projects/foo 中,忘记了它还没有初始化 git 存储库,然后在中执行 git add bar.xyz foo 目录。这会导致将文件添加到配置存储库中)。

我不确定将 git 存储库嵌套在已经有 git 存储库的目录下是否明智,尽管我还没有遇到任何基本问题。

有没有更好的方法,或者这是人们在 git 中存储本地配置文件的标准方式?

【问题讨论】:

  • 如果您这样做是为了在机器之间同步文件,我只会使用 Dropbox。如果你想要git,设置将是类似的:在某个地方有一个包含源代码的目录(例如~/Dropbox/home,并有一个骨架~/.bashrc~/Dropbox/home/.bashrc 并将其他文件符号链接到~
  • 有很多工具可以做到这一点。请参阅“通用点文件实用程序”下的dotfiles.github.io

标签: git config


【解决方案1】:

我和你一样将我的点文件保存在一个 Git 存储库中——我的主目录是一个 Git 存储库。

  • git gui:我很少使用它,所以我不确定它的性能如何受到大量未跟踪文件的影响。但是,我确实有一个仅包含*~/.gitignore 文件。也许忽略一切会为您加速git gui

  • 意外添加文件:创建一个只包含*~/.gitignore 文件也解决了当您忘记初始化新项目存储库时意外添加文件到您的dotfiles 存储库的问题(它会告诉您如果你真的想添加文件,请使用-f)。

  • 我从来没有遇到过嵌套存储库的问题。

一些注意事项:

  • 我将~/.gitignore 设置为* 的主要原因是git status 不会显示我的主目录中的每个文件。它迫使我一直使用git add -f,这有点烦人,但没什么大不了的。

  • 养成使用git clean -dx 而不是git clean -dxf 的习惯。您必须记住在新项目存储库中运行 git config clean.requireForce false,但如果您不在您认为自己所在的目录中,它会防止您意外删除主目录中的所有文件。

  • Git 有时会决定重置文件权限。如果您想在 Git 存储库中保留敏感文件 (chmod og-rwx),这可能会很糟糕。我通过一个post-checkout 钩子来处理这个问题,该钩子修复了某些文件和目录的权限(例如,~/.ssh/authorized_keys)。

【讨论】:

    【解决方案2】:

    我正在使用 git repo 来管理点文件。它包含:

    1. 一个目录dotfiles,其中包含我要跟踪的实际点文件/点目录。
    2. 一个shell脚本,在$HOME中创建dotfiles/.*的符号链接,比如

      for dotfile in dotfiles/.* ; do
        case $(basename $dotfile) in
          .)
            ;;
          ..)
            ;;
          *)
            ln -sv $(realpath dotfile) $HOME/$(basename $dotfile)
            ;;
        esac
      done
      

    在我在 dotfiles(通常通过将点文件移动到 repo 中)或新的干净的 $HOME 中添加新内容后手动运行脚本。

    repo 可以驻留在任何地方。在我使用的每台主机上,我在 $HOME 中都有一个克隆。

    通过这种方式,我有一个更小且非嵌套的工作树,可以选择性地跟踪点文件。

    附言您可能想将dotfiles/.config/* 之类的条目添加到.gitignore,它包含许多我不想跟踪的文件。

    【讨论】:

    • 我喜欢这个想法,但该 shell 脚本中的某些命令默认情况下不可用(例如:OSX 没有真实路径)。
    • 问题:我这样做,但我想知道您如何处理特定于机器的变化?例如,在我的家用计算机上,我希望我的 gitconfig 电子邮件成为我的个人电子邮件,但在我的工作计算机上,我希望它成为我的工作电子邮件等。目前我通过将某些文件从 dotfiles 复制到我的$HOME 来处理这个问题,但是这成为维护的噩梦(如果我想添加一个新的 git 别名,我必须更新两个 .gitconfig 文件等)。
    • @AdamParkin 每台机器的设置也分发给我 (.asoundrc)。对于 git author,我使用 zsh cd 挂钩从路径中为每个 repo 设置作者,请参阅 this gist。没有尝试过,但全局 git 钩子可能能够做类似的事情。
    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多