使用 git 管理主目录
Posted
技术标签:
【中文标题】使用 git 管理主目录【英文标题】:Use git to manage home directory 【发布时间】:2014-02-11 13:37:23 【问题描述】:我想在我的 Linux $HOME 目录中创建 一个 git repo。在这个 repo 中 - 显然 - 我可以在版本控制下添加所有内容,但这没有任何意义。我只想添加与我相关的文件和文件夹,例如 .vimrc、.vim、.bashrc 等。 (可能只有隐藏的文件和文件夹,但也可能不是)
我知道我可以利用 .gitignore 来尝试实现这种行为,但这会很痛苦并且几乎无法维护。相反,我想知道的是,是否有任何方法可以手动声明我想要管理的文件和文件夹,仅此而已。
【问题讨论】:
你的意思是dotfiles? Adding your .vim ~/.vimrc to github (aka dot files)的可能重复 【参考方案1】:我想你正在寻找dotfiles。
【讨论】:
目前使用 .gitignore 文件似乎更适合我的用例,但感谢您指出这一点!【参考方案2】:.gitignore
# Ignore everything
*
# But not these files...
!*.vimrc
!*.vim
!*.bashrc
!.gitignore
# etc...
我的主目录也在GitHub。
【讨论】:
新的.git
目录。 git init
创建的与任何现有的用户特定配置冲突。通常在主目录中找到。?
我知道这是操作人员要求的,但我个人不喜欢这种方法。如果您的主目录中出现新内容,您将永远不会收到自动警告。理想情况下,您只需决定是否忽略它或保留它。我现在正在尝试使用干净的 debian 安装,但不可否认,那里已经有很多东西了。 /home 的一个好的示例 .gitignore 文件将是一个很好的资源,因为任何新的东西都应该是您安装的新软件,在这种情况下,我至少希望看到它出现并决定是否要在我的 vcs 中配置它。
优点是,如果我重新安装或迁移等,我可以将旧的 repo 添加为远程,然后获取我所有软件的所有配置并合并我想要的。不仅仅是 .bashrc 和其他一些东西。
这很好,但如果你的主目录中有其他 Git 模块,那就不行了。
@user1115652 的观点是反对这一点的有效论据。但是,我们可以使用git clean -nxd .[^.]*
列出所有被.gitignore
忽略的文件。这是列出我们主目录中所有 untracked 文件的有趣替代品,因为 *
规则会忽略所有内容,从而使我们能够在 Git 存储库中找到我们可能想要跟踪的任何潜在的额外配置文件.我们还可以使用git check-ignore
来检查文件是否被忽略,但这与git clean
试运行有点不同。【参考方案3】:
我会设置一个别名,仅用于您的 home repo 这样你就可以使用别名代替 git 命令,并且你总是知道你正在工作的上下文
# .bashrc
alias home='git --work-tree=$HOME --git-dir=$HOME/.home'
发布命令
$ home init
将在 $HOME 的 .home 文件夹中创建一个 repo,与当前目录无关,您可以使用别名 'home' 代替 'git' 使用 home repo
这和 .gitignore 应该是你所需要的。
# .gitignore
*
# keep track
!.bashrc
!.gitignore
注意。不要将 .ssh/keys 保留在 repo 中,因为它会带来文件权限和安全问题。
【讨论】:
这是一个绝妙的解决方案;谢谢!我唯一的改变是不使用.gitignore
,而是使用$GIT_DIR/info/exclude
(所以,$HOME/.home/info/exclude
)。我也更喜欢$HOME/.home.git
之类的,但这大多是多余的,手头有这个别名。
只是好奇,如果我在机器 A 上实现了这个解决方案并在机器 B 上克隆了 repo,git 会覆盖 B 上主目录中的现有文件吗?
A blog about this technique。一个相关的HN thread。
该技术与任何 git 工具如 Fork/GitKraken/Sourcetree 不兼容。如果您对 git CLI 感到满意 - 太好了!如果不是......你要么需要克服它,要么使用不同的技术。 (您的工具可能支持自定义 work-tree
和 git-dir
,例如 Magit,但您需要自己研究/做。)【参考方案4】:
我建议不要将您的 $HOME 目录置于 git 版本控制之下。我这样做是因为我认为我非常聪明并且希望我的 .dotfiles 处于版本控制之下。然而,git 是贪婪和贪婪的。我不得不在我的 $HOME/.gitignore 中添加大量目录(甚至 *)。您的主目录中的其他地方是否有任何 git 存储库?我做到了。但是那些 git 存储库将使用您的 $HOME/.gitignore 作为您的全局 .gitignore,除非您在其他地方设置它。因此,尝试在这些子目录存储库中添加文件真的很痛苦。
相反,请将您的重要文件放在单独的目录中。说,~/dotfiles.现在让它成为一个 git 存储库,并将所有重要的 .dotfiles 符号链接到该新存储库。瞧。问题已解决,尽管在链接上投入了一些时间。
【讨论】:
想象一下忘记你在~
并在做git clean -xdf
。 ?(我在其他存储库中定期执行此操作以使其恢复到干净状态。显然~
中的影响将是灾难性。)另外,chezmoi 自动执行如果您将其配置设置为mode = "symlink"
,则符号链接【参考方案5】:
我认为最好的方法是在其他地方(最好在物理上不同的磁盘中)设置一个 git 存储库,然后在其中添加您的文件。 你可以使用doing创建空的git repo (在一个安全的文件系统上,最好是不同的磁盘,比如 /home1)
sudo git init --bare mynewrepos.git
sudo chown -fR myself mynewrepos.git
sudo chgrp -fR myself mynewrepos.git
现在,转到您的主目录,然后执行
git clone /home1/mynewrepos.git # now you are cloning from empty git repos.
然后将您宝贵的文件添加到 git(git add、git commit、git push .. 等等)。我没有尝试将我常用的文件保存在我的家中,但我使用这种方法来管理我的本地项目文件(在上传到官方 git repos 之前。)。但是同样,如果您的 home 下有许多 git 管理的文件,它们可能会受到您 home 下的 .gitignorefiles 的影响。
【讨论】:
以上是关于使用 git 管理主目录的主要内容,如果未能解决你的问题,请参考以下文章
git 将系统配置文件视为主目录而不是用户主文件夹(Windows 7)