金钱(警告)
** 状态:** 被贬值
如果您目前正在运行运行 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 密钥。
它将看起来像这样的东西:
使用命令建议将您的配置带入远程存储库. 最有可能的是,它将是以下几点:
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
您的配置文件现在应该在新计算机上可用。
结论
通过不断对您的配置文件进行更改到您的远程存储库,您应该能够在远程机器上快速而轻松地重建您环境中最重要的部分。