状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
当您使用 Linux 机器时,您可能会开始大量定制您的环境。 一些常用的应用程序(如文本编辑器)是如此可配置的,以至于未经修改的版本看起来像是完全不同的程序。
调整配置可能需要做大量工作,而且随着时间的推移,随着使用情况的变化,您通常会进行一些小的编辑。 仅在一台计算机上就可以处理很多事情,但是当您想在多台计算机上同步设置时,事情很快就会变得复杂而笨拙。
在本文中,我们将讨论一种处理您希望跨机器共享的复杂配置文件的方法。 我们将使用 git 版本控制来管理我们的重要文件。 然后我们可以将这些文件上传到远程存储库,然后将这些文件下拉到其他计算机。
我们将在 Ubuntu 12.04 机器上演示这些想法,但由于 git 的性质和我们将使用的配置文件,任何合理最新的 Linux 发行版都应该以类似的方式工作。
基本理念
在我们进入实现这个想法的实际步骤之前,让我们谈谈我们实际要设置的内容。
我们将假设您有一台已经在进行一些繁重配置的计算机。 这是我们将用来构建我们的 git 存储库的系统。 我们会将适当的文件添加到 repo,然后将其推送到我们的远程 git 存储库。
远程 git 存储库将是我们可以存储配置数据的地方。 我们可能想要放置配置文件的所有其他机器都应该可以访问它。 有些人觉得使用像 GitHub 这样的公共空间来托管他们的文件很舒服,但这会带来不小心将敏感数据推送到世界可读位置的风险。
在我们的指南中,我们将改为使用 GitLab,这是一种自托管 git 存储库解决方案,您可以在自己的机器上安装和使用。 DigitalOcean 提供一键式 GitLab 安装镜像供您创建预配置的 GitLab VPS。 如果您想走这条路,我们还将介绍如何自己安装 GitLab。
在我们的配置文件在我们的远程 git 存储库中之后,我们可以将文件拉到新系统上以实现我们的设置。
我们应该提交什么类型的文件?
尽管您对新系统进行了许多不同级别的自定义,但某些类型的文件和自定义比其他类型的解决方案更适合这种类型的解决方案。
具有高度依赖于系统的值的文件可能应该手动处理或使用其他方法处理,例如 Chef、Puppet 或 Ansible 等配置管理系统。
如果您正在做的定制是较少的用户偏好并且更接近系统操作细节,那么使用 git 可能对您没有多大帮助。 无论如何,您都必须更改大多数值以匹配客户端系统。
工具和用户环境文件的配置最适合这种类型的解决方案。 诸如 vim、emacs、screen、tmux、bash 等的自定义。 是此类配置的绝佳候选者。
一般来说,一个好的经验法则是可以使用任何不包含敏感或严重依赖机器设置的“dotfile”(位于主目录中的隐藏配置文件)。 如果您使用的是 GitHub 的自托管替代方案,例如 GitLab,则可以包含包含敏感信息的文件,风险自负。
设置您的播种机
我们将把已经修改过的配置文件的计算机称为“种子”机器。 这将是我们的配置文件的来源。
我们需要确保我们已经安装了 git,这样我们才能真正实现我们的配置同步。 从您的发行版提供的存储库中安装 git。 对于 Ubuntu,这些命令应该可以工作:
sudo apt-get update sudo apt-get install git
安装 git 后,我们应该设置一些配置细节,以保持我们的提交消息干净。 在以下命令中替换您自己的姓名和电子邮件地址:
git 配置 --global 用户名 “你的名字” git config --global user.email “电子邮件 @领域 .com ”
在这一点上,我们可以采取许多不同的方法。 让我依次解释每一个,因为这个选择会影响我们以后如何进行。
将整个主目录用作 Git 存储库
也许我们拥有的最简单的方法是简单地在我们的主目录中初始化一个 git 存储库。 这种方法的优点是非常简单直接,但随着事情的发展会变得混乱。
我们可以通过键入以下内容开始此方法:
cd ~ git init
将在我们的主目录中创建一个 git 存储库。 如果我们查看文件的状态,我们可以看到有很多文件标记为“未跟踪”:
git status
# On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # .bash_history # .bash_logout # .bashrc # .gitconfig # .profile # .screenrc # .ssh/ # .viminfo # .vimrc nothing added to commit but untracked files present (use "git add" to track)
git 能看到我们所有的文件是件好事,但是如果大多数文件都被认为是“未跟踪的”并且每次查看时都会创建一个这样的长列表,那么当我们更多地使用这台计算机时,这将是一件相当痛苦的事情。
如果这不打扰您,您可以简单地将您想要的文件添加到 git 存储库,如下所示:
git add .bashrc git add .vimrc . . .
如果你想保持你的 git 状态干净,以便它只提供你认为有用的信息,你可以告诉 git 默认忽略 all 文件,我们可以专门为文件创建例外我们要检查版本控制。
我们可以通过在我们的目录中创建一个 .gitignore
文件来做到这一点,该文件有一个匹配所有内容的通配符:
echo "*" > .gitignore
如果我们这样做并检查我们的 repo 的状态,你会发现没有任何东西可以跟踪:
git status
# On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
在这种情况下,您将不得不通过使用 -f
标志来强制添加要添加的文件:
git add -f .bashrc git add -f .vimrc . . .
无论哪种方式,您都需要在完成后提交更改:
git commit -m "Initial configuration commit"
创建配置目录来存储文件
创建包含整个主目录的 git 存储库的另一种方法是创建一个单独的目录,专门用于跟踪这些文件。
出于本教程的目的,我们将此目录称为 configs
:
cd ~ mkdir configs
我们可以进入这个目录,然后在这里初始化一个 git 存储库而不是主目录:
cd configs git init
现在,我们有一个 git 存储库,但里面没有任何文件。 我们希望将我们的文件放到这个目录中,以便它们可以通过我们的版本控制系统提交,但我们也希望我们的文件在主目录中可用,以便程序可以正确找到它们。
实现这两个目标的解决方案是将文件复制到此目录中,然后将系统链接创建回主目录。
对于每个文件,这将如下所示:
mv ~/.vimrc . ln -s .vimrc ~/ mv ~/.bashrc . ls -s .vimrc ~/ . . .
现在,我们在 ~/configs
目录中拥有所有实际配置文件,并且在我们的主目录中拥有这些文件的符号链接。
这听起来可能更复杂,但它大大简化了 git 方面的事情。 要添加所有文件,我们只需键入:
git add .
然后我们可以像这样提交它们:
git commit -m "Initial configuration commit"
这种方法简化了 git 端,同时可能使文件的实际管理更加复杂。
将 Git 目录与工作树分离
第三种方法尝试解决尝试对主目录本身进行版本控制时所固有的一些问题。 它将实际的 git 存储库与提取文件的位置分开。
如果您喜欢直接对主目录进行版本控制的想法,这可能很有用,但您发现拥有其他 git 存储库会使事情复杂化。
基本上,当你初始化一个 git repo 时,默认情况下,当前目录被认为是 checkouts 放置和修改文件的工作目录。 将在此目录中创建一个名为 .git
的 git 存储库。
但是,我们可以强制 git 使用单独的工作目录。
我们可以像上一个替代方案一样开始,为我们的配置创建一个单独的目录:
cd ~ mkdir configs
再次,进入目录,然后初始化 git 存储库:
cd configs git init
为了向您展示事情将如何变化,让我们看看 git status 现在说什么:
git status
# On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)
目前,工作目录是 repo 所在的 ~/configs
目录。 这里没有文件,所以它显示为空,没有任何东西可以提交。
现在,我们做的事情有点不同。 我们将首先使用 core.worktree
git 配置选项指定不同的工作目录:
git config core.worktree "../../"
这样做是建立相对于 .git
目录的路径的工作目录。 第一个 ../
指的是 ~/configs
目录,第二个指向我们的主目录。
基本上,我们已经告诉 git“将存储库保留在这里,但您管理的文件比存储库高两个级别”。
要查看发生了什么变化,我们可以再次检查状态:
git status
# On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # ../.bash_history # ../.bash_logout # ../.bashrc # ../.gitconfig # ../.lesshst # ../.profile # ../.screenrc # ../.ssh/ # ../.viminfo # ../.vimrc nothing added to commit but untracked files present (use "git add" to track)
您可以看到 git 现在正在引用主目录中的文件。
我们现在可以通过引用与主目录相关的文件来添加文件:
git add ~/.vimrc git add ~/.screenrc git add ~/.bashrc . . .
然后我们可以像这样提交:
git commit -m "Initial configuration commit"
在目录中,如果您以后必须提取信息,为了让 git 将所有部分重新组合在一起,您必须放置一个 /.git
文件:
cd ~ nano .git
在里面,你只需要一行将 git 引导到 repo 文件:
gitdir: /home/ your_user /configs/.git
这将使一切顺利进行。
设置远程 Git 服务器
根据您的需要,有多种选项可用于设置远程存储库来存放您的文件。
一个明显的选择是将您的配置存储库推送到 GitHub。 对于某些人来说,这可能是一个很好的方法,但请记住,它确实存在意外暴露敏感数据的可能性。
如果您想通过推送到自己的私有 git 存储库来避免这种情况,GitLab 是一个不错的选择。
在 DigitalOcean 上,您可以使用 一键式 GitLab 图像 开始运行。
另一种选择是自己安装 GitLab。 本指南将引导您了解 如何在您自己的服务器上安装和配置 GitLab 。
无论您如何设置它,您都必须创建一个新的空存储库来充当您的远程目标。
创建空存储库后,GitHub 或 GitLab 将为您提供一个页面,其中包含有关如何将配置文件放入存储库的命令。 除非您已经添加了 SSH 密钥,否则您很可能希望单击该按钮以切换到 HTTP 命令而不是 SSH。
它看起来像这样:
使用命令建议将您的配置放入远程存储库。 最有可能的情况是:
cd configs #或 “cd ~” 如果你使用你的主目录git remote add origin http:// git_lab_ip / your_gitlab_user / repo_name .git git push -u origin master
这会将您的配置推送到 GitLab 存储库中。
从远程仓库拉取配置
现在我们的远程仓库中有配置文件,我们可以从其他机器上下载它们。 我们将要添加配置文件的服务器称为“目标”机器。
在目标机器上,确保您已安装 git。 在 Ubuntu 上,这将再次像这样完成:
sudo apt-get update sudo apt-get install git
一旦你安装了这个,你应该再次设置你的基本配置变量:
git 配置 --global 用户名 “你的名字” git config --global user.email “电子邮件 @领域 .com ”
下一步再次取决于您希望这台机器如何与 git repo 文件交互。
将主目录置于版本控制之下
如果你想让整个主目录受 git 版本控制,你应该在那里启动一个空的 git repo:
cd ~ git init
从这里,我们可以添加 GitHub 或 GitLab 存储库作为此存储库的来源:
git remote add origin http:// git_lab_ip / your_gitlab_user / repo_name .git
在此之后,如果我们在这台机器上已经有可能与我们的仓库中的内容发生冲突的文件,我们将需要做一些不同的事情。 例如,每个用户通常默认包含一个 ~/.bashrc
文件。
一种选择是删除或移动与我们的 repo 文件冲突的每个文件。 但是,我们也可以告诉 git 用远程版本覆盖所有冲突的文件。
我们可以通过首先获取远程文件,然后告诉 git 重置到最近的提交来做到这一点,这应该是我们的远程版本:
git fetch --all git reset --hard origin/master
这应该将所有远程文件带入我们的新机器。
您可以轻松地修改这台机器上的文件并将它们推送回远程仓库:
echo "# a comment" >> .bashrc git add .bashrc git commit -m "test" git push origin master
使用单独的配置目录
如果您更喜欢使用单独的目录来保存实际的配置文件,并且只想将这些文件链接到您的主目录,则可以克隆存储库。
我们只需要再次引用我们的远程存储库的 URL。 这一次,我们将只使用克隆而不是初始化一个新的 git 存储库:
git clone http : //git_lab_ip/your_gitlab_user/configs.git
现在,我们可以进入我们新克隆的目录:
cd configs
这将包含我们所有的配置文件。 然后我们可以将它们单独链接到我们的主目录:
ln -s .vimrc ~/ ln -s .screenrc ~/
同样,您可能需要移动或删除与新文件冲突的文件:
rm ~/.bashrc ln -s .bashrc ~/
这是一个更加手动的过程,但您可以更精细地控制要在此计算机上激活的文件。
实现单独的 Git 存储库和目录
为了实现我们为种子机讨论过的分离的工作目录和 repo 设置,我们可以再次克隆 repo。
此方法的不同之处在于,由于我们希望存储库将其文件直接卸载到我们的主目录中,因此我们不会在克隆时检出任何文件:
git clone --no- checkout http : //git_lab_ip/your_gitlab_user/configs.git
现在,我们需要告诉 git 我们要将文件解压到位于 ~/configs/.git
目录(主目录)上方两层的目录中:
cd configs git config core.worktree "../../"
现在,我们可以显式检出文件。 同样,我们需要强制 git 覆盖我们当前的文件。 我们可以通过“重置”回远程仓库中文件所在的状态来做到这一点:
git reset --hard origin/master
您的配置文件现在应该可以在您的新计算机上使用。
结论
您现在应该有一些选项可以用于将您的个人配置文件保存在版本控制中。 通过不断地将配置文件的更改提交到远程存储库,您应该能够快速轻松地在远程计算机上重新创建环境中最重要的部分。