如何在 Linux VPS 上使用 Git 管理用户配置文件

金钱(警告)

** 状态:** 被贬值

如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:

** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。

** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。

介绍


当你使用Linux机器时,你可能会开始大大地定制你的环境,一些常用的应用程序,如文本编辑器,是如此可配置,以至于未修改的版本可能看起来像完全不同的程序。

调整配置可能需要相当多的工作,而且随着时间的推移,您会进行小额编辑,因为您的使用情况会随着时间的推移而发生变化,但当您想要在多个机器上同步设置时,事情可能会变得复杂和不便。

在本文中,我们将讨论处理您希望在机器之间共享的复杂配置文件的一个方法. 我们将使用 git 版本控制来管理我们的重要文件. 然后我们可以将这些文件上传到远程存储库,然后将这些文件拖到其他计算机。

我们将在 Ubuntu 12.04 机器上展示这些想法,但由于 git 的性质和我们将使用的配置文件,任何合理的最新 Linux 发行版都应该以类似的方式工作。

基本理念


在我们跳入实施这一想法的实际步骤之前,让我们谈谈我们实际上要建立什么。

我们将假设你有一个计算机,一些重型配置已经在进行中. 这是我们将使用的系统来构建我们的 git 存储库. 我们将添加相应的文件到 repo,然后将其推到我们的远程 git 存储库。

远程Git存储器将是我们可以存储配置数据的地方,它应该可以访问我们可能想要放置配置文件的所有其他机器,有些人觉得很舒服地使用GitHub等公共空间来托管他们的文件,但这伴随着意外将敏感数据推向世界可读的位置的风险。

在我们的指南中,我们将使用GitLab,一个自我托管的Git存储解决方案,您可以在自己的机器上安装和使用。DigitalOcean为您提供一个单击的GitLab安装图像,以创建预配置的GitLab VPS。

一旦我们的配置文件在我们的远程 git 存储库中,我们可以将文件拖到新的系统中来实现我们的设置。

我们应该承诺什么类型的文件?


虽然在新系统中有许多不同级别的定制,但某些类型的文件和定制比其他类型的解决方案更合适。

具有高度系统依赖的值的文件可能要么手动处理,要么使用其他方法,比如 Chef、Puppet 或 Ansible 等配置管理系统。

如果你正在做的定制更少用户偏好,更接近系统操作细节,那么使用 git 可能不会帮助你很多。

工具和用户环境文件的配置最适合这种类型的解决方案,如vim、emacs、屏幕、tmux、bash等的自定义是这种类型的选择。

一般来说,一个很好的规则是,任何不包含敏感或高度机器依赖的设置的dotfile(位于您的主目录中隐藏的配置文件)都可以使用。

设置你的种子机器


我们将参考已经修改了配置文件的计算机,您希望将其用作种子机器。

我们需要确保我们安装了 git,以便我们能够实际上实现我们的配置同步。 安装 git 从您的发行提供的存储库。

1sudo apt-get update
2sudo apt-get install git

在我们安装 git 后,我们应该设置一些配置细节,以保持我们的 commit 消息清洁。

git config --global user.name "your name"
git config --global user.email "[email protected]"

在这一点上,我们有许多不同的方法,我们可以采取,让我分别解释,因为这个选择会影响我们以后如何继续。

使用您的整个家庭目录作为Git Repo


也许我们拥有的最简单的方法是简单地在我们的家庭目录中初始化 git 存储库. 这种方法具有非常简单和直接的前进的优势,但随着事情的进展而变得混乱。

我们可以通过键入开始这个方法:

1cd ~
2git init

在我们的主目录中将创建一个 git 存储库. 如果我们看到我们的文件的状态,我们可以看到有许多被标记为未跟踪的文件:

1git status

 1# On branch master
 2#
 3# Initial commit
 4#
 5# Untracked files:
 6#   (use "git add <file>..." to include in what will be committed)
 7#
 8#	.bash_history
 9#	.bash_logout
10#	.bashrc
11#	.gitconfig
12#	.profile
13#	.screenrc
14#	.ssh/
15#	.viminfo
16#	.vimrc
17nothing added to commit but untracked files present (use "git add" to track)

它是好的,Git看到我们的所有文件,但它将是相当痛苦的,因为我们使用这个计算机更多,如果大多数文件被认为是未跟踪,并创建一个长的列表,这样的每次我们看这个。

如果这不打扰您,您可以简单地将您想要的文件添加到git repo中,如下:

1git add .bashrc
2git add .vimrc
3. . .

如果您更愿意保持 git 状态干净,以便它只提供您可能认为有用的信息,您可以代替 git 默认地忽略 all 文件,我们可以为我们想要检查版本控制的文件创建例外。

我们可以通过在我们的目录中创建一个 .gitignore 文件来做到这一点,该文件具有匹配一切的野卡:

1echo "*" > .gitignore

如果我们这样做并检查我们的复制品的状态,你会看到没有什么可追踪的:

1git status

1# On branch master
2#
3# Initial commit
4#
5nothing to commit (create/copy files and use "git add" to track)

在这种情况下,您将不得不使用-f旗帜来强制添加您想要添加的文件:

1git add -f .bashrc
2git add -f .vimrc
3. . .

无论如何,您需要在完成后做出更改:

1git commit -m "Initial configuration commit"

创建一个配置目录来存储文件


创建包含整个主目录的 git 存储库的替代方法是创建一个单独的目录,专门用于跟踪这些文件。

对于本教程的目的,我们将这个目录称为configs:

1cd ~
2mkdir configs

我们可以输入此目录,然后在这里初始化 git 存储库,而不是主目录:

1cd configs
2git init

现在,我们有一个 git 存储库,但里面没有任何文件. 我们希望将我们的文件放入这个目录,以便它们可以与我们的版本控制系统进行交互,但我们也希望我们的文件在主目录中可用,以便程序可以正确地找到它们。

实现这两个目标的解决方案是将文件复制到该目录,然后创建系统链接回到主目录。

对于每个文件,这将是这样的:

1mv ~/.vimrc .
2ln -s .vimrc ~/
3mv ~/.bashrc .
4ls -s .vimrc ~/
5. . .

我们现在在我们的~/configs目录中有我们实际的配置文件,并且在我们的主目录中有符号链接到这些文件。

这可能听起来更复杂,但它简化了Git方面的事情相当一小部分. 要添加所有文件,我们可以简单地键入:

1git add .

然后我们可以这样承诺他们:

1git commit -m "Initial configuration commit"

这种方法简化了git的一面,同时可能使您的文件的实际管理更为复杂。

将 Git 目录与工作树分开


第三种方法试图解决尝试版本自家目录的一些问题,它将实际的 git 存储库与它拖动文件的地方分开。

如果您喜欢直接版本您的主目录的想法,这可能是有用的,但您发现具有其他 git 存储库使事情变得复杂。

基本上,当您初始化 git repo 时,默认情况下,当前目录被视为 checkouts 将存储和修改文件的工作目录。

但是,我们可以强迫 git 使用单独的工作目录。

我们可以像我们在最后一个选项中一样开始,为我们的配置创建一个单独的目录:

1cd ~
2mkdir configs

再次,移动到目录中,然后启动 git 存储库:

1cd configs
2git init

为了向你展示事情将如何改变,让我们看看Git状态现在说的是什么:

1git status

1# On branch master
2#
3# Initial commit
4#
5nothing to commit (create/copy files and use "git add" to track)

目前,工作目录是 repo 所在的 `~/configs 目录. 这里没有文件,所以它显示为空,无需承诺。

现在,我们做的事情有点不同. 我们将通过使用core.worktree git 配置选项来指定不同的工作目录:

1git config core.worktree "../../"

这所做的就是建立工作目录,相对于.git 目录的路径。第一个 ../ 指的是 `~/configs 目录,而第二个目录则向我们指向我们的主目录。

基本上,我们告诉Git在这里保留存储库,但你正在管理的文件在Repo的两级以上

要看看发生了什么变化,我们可以再次检查状态:

1git status

 1# On branch master
 2#
 3# Initial commit
 4#
 5# Untracked files:
 6#   (use "git add <file>..." to include in what will be committed)
 7#
 8#       ../.bash_history
 9#       ../.bash_logout
10#       ../.bashrc
11#       ../.gitconfig
12#       ../.lesshst
13#       ../.profile
14#       ../.screenrc
15#       ../.ssh/
16#       ../.viminfo
17#       ../.vimrc
18nothing added to commit but untracked files present (use "git add" to track)

您可以看到git现在正在引用家庭目录中的文件。

现在我们可以通过与主目录相关的引用添加文件:

1git add ~/.vimrc
2git add ~/.screenrc
3git add ~/.bashrc
4. . .

我们可以这样承诺:

1git commit -m "Initial configuration commit"

在目录中,为了让 git 将所有片段重新聚合在一起,如果您需要稍后拉出信息,您将需要插入一个 /.git 文件:

1cd ~
2nano .git

内部,你所需要的只是一条线,将 git 指向 repo 文件:

gitdir: /home/your_user/configs/.git

这将允许一切顺利工作。

设置远程 Git 服务器


根据您的需求,有各种选项来设置远程存储库来容纳您的文件。

一个显而易见的选择是将配置重置推向GitHub,这对一些人来说可能是一个很好的方法,但请记住,它确实提供了意外暴露敏感数据的可能性。

如果你想通过推到自己的私人 git 存储库来避免这种情况,GitLab 就是一个很好的选择。

在DigitalOcean上,您可以使用一个单击的GitLab图像(https://www.digitalocean.com/community/articles/how-to-use-the-gitlab-one-click-install-image-to-manage-git-repositories)来打击地面运行。

另一种选择是自行安装GitLab,本指南将向您介绍如何在您自己的服务器上安装和配置GitLab(LINK0)。

无论您如何设置它,您都必须创建一个新的空库,以作为您的远程目标。

一旦您创建了一个空的存储库,GitHub 或 GitLab 将为您提供一页关于如何将配置文件带入存储库的命令. 您很可能会想点击按钮切换到 HTTP 命令而不是 SSH,除非您已经添加了 SSH 密钥。

它将看起来像这样的东西:

GitLab existing repo

使用命令建议将您的配置带入远程存储库. 最有可能的是,它将是以下几点:

cd configs      # or "cd ~" if you are using your home directory
git remote add origin http://git_lab_ip/your_gitlab_user/repo_name.git
git push -u origin master

这将推动您的配置进入GitLab复制。

从远程 Repo 拉出配置


现在我们有我们的配置文件在我们的远程复制,我们可以从其他机器下载它们. 我们将参考我们想要添加我们的配置文件的服务器作为我们的目标机器。

在目标机器上,确保你安装了 git. 在Ubuntu上,这将再次实现如下:

1sudo apt-get update
2sudo apt-get install git

一旦您安装了此功能,您应该重新设置您的基本配置变量:

git config --global user.name "your name"
git config --global user.email "[email protected]"

下一步再次取决于您希望该机器如何与 git repo 文件进行交互。

将 Home Directory 置于版本控制中


如果你想在 git 版本控制下拥有整个主目录,你应该在那里启动一个空的 git repo:

1cd ~
2git init

从这里,我们可以添加 GitHub 或 GitLab 复制品作为此复制品的起源:

git remote add origin http://git_lab_ip/your_gitlab_user/repo_name.git

在这一点之后,如果我们已经在这个机器上有文件,我们需要做一些不同的事情,这些文件可能与我们的Repo发生冲突,例如,一个~/.bashrc文件通常是每个用户的默认包含。

一个选项是删除或移动与我们的Repo文件相冲突的每个文件,但是,我们也可以简单地告诉Git与远程版本重写所有相冲突的文件。

我们可以这样做,首先收集远程文件,然后告诉 git 重置到最新的 commit,这应该是我们的远程版本:

1git fetch --all
2git reset --hard origin/master

这应该将所有远程文件带入我们的新机器。

您可以轻松地在这个机器上修改文件,并将其推回远程复制器:

1echo "# a comment" >> .bashrc
2git add .bashrc
3git commit -m "test"
4git push origin master

使用单独的配置目录


如果您更喜欢使用单独的目录来存储实际配置文件,并且只想将这些文件链接到您的主目录,您可以克隆存储库。

我们只需要引用我们的远程存储的URL,这一次,我们只会使用克隆,而不是初始化新的git存储:

git clone http://git_lab_ip/your_gitlab_user/configs.git

现在,我们可以进入我们新克隆的目录:

1cd configs

这将有我们所有的配置文件,然后我们可以将它们单独链接到我们的主目录:

1ln -s .vimrc ~/
2ln -s .screenrc ~/

再次,您可能需要移动或删除与新文件冲突的文件:

1rm ~/.bashrc
2ln -s .bashrc ~/

这是一个更为手动的过程,但你可以对你想要在这个计算机上活跃的文件进行更精细的控制。

执行独立的 Git Repo 和目录


为了实现我们谈论的种子机的独立工作目录和 Repo 设置,我们可以再次克隆 Repo。

与这种方法的区别在于,由于我们希望存储库直接将其文件下载到我们的主目录中,我们不会在克隆时检查任何文件:

git clone --no-checkout http://git_lab_ip/your_gitlab_user/configs.git

现在,我们需要告诉 git,我们要将我们的文件解包到位于 `~/configs/.git’ 目录(主目录)两层以上的目录中:

1cd configs
2git config core.worktree "../../"

现在,我们可以明确检查文件. 再次,我们需要强迫 git 重写我们的当前文件. 我们可以通过重置返回我们的远程复制站的状态来做到这一点:

1git reset --hard origin/master

您的配置文件现在应该在新计算机上可用。

结论


通过不断对您的配置文件进行更改到您的远程存储库,您应该能够在远程机器上快速而轻松地重建您环境中最重要的部分。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus