介绍
当您使用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 config --global user.name "your name" git config --global user.email "email@domain.com"
在这一点上,我们有许多不同的方法,我们可以采取。 让我逐一解释每一个,因为这个选择将影响我们以后如何进行。
使用整个主目录作为Git Repo
也许我们最简单的方法是简单地在我们的主目录中初始化一个git仓库。 这种方法的优点是非常简单和直接,但随着事情的发展可能会变得麻烦。
我们可以通过输入以下内容开始此方法:
cd ~
git init
将在我们的主目录中创建一个git存储库。 如果我们看到我们的文件的状态,我们可以看到有很多文件标记为“untracked”:
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 repo,像这样:
git add .bashrc
git add .vimrc
. . .
如果你宁愿保持你的git的状态干净,所以它提供了你可能会认为有用的信息只,而是可以让Git忽略默认情况下所有的文件,我们可以专门创建,我们要检查到版本的文件例外控制。
我们可以通过创建一个做到这一点.gitignore
在我们的目录中的文件有一个通配符将匹配一切:
echo "*" > .gitignore
如果我们这样做,并检查我们的仓库的状态,你会看到没有什么是跟踪:
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,默认情况下,当前目录被认为是工作目录,检出将放置和修改文件。 一个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)
目前,工作目录是~/configs
目录,回购的位置。 这里没有文件,所以它显示为空,没有任何提交。
现在,我们做的事情有点不同。 我们将通过指定不同的工作目录开始core.worktree
git的配置选项:
git config core.worktree "../../"
这样做是建立工作相对路径目录中.git
目录。 第一../
指的是~/configs
目录,第二个点我们一步超出了我们的主目录。
基本上,我们已经告诉git“保持存储库在这里,但你管理的文件是两个级别上面的repo”。
要查看更改的内容,我们可以再次检查状态:
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
文件:
cd ~
nano .git
在里面,你需要的是一个将git指向repo文件的行:
gitdir: /home/your_user/configs/.git
这将允许一切工作顺利。
设置远程Git服务器
根据您的需要,有多种选项可用于设置远程存储库来存放文件。
一个明显的选择是将您的配置repo推送到GitHub。 这对于一些人来说可能是一个很好的方法,但请记住,它提供了意外暴露敏感数据的可能性。
如果你想通过推送到你自己的私人git仓库避免这种情况,GitLab是一个伟大的选择。
在DigitalOcean,您可以使用一键GitLab图像以旗开得胜。
另一个选择是自己安装GitLab。 本指南将引导您如何安装和配置GitLab自己的服务器上。
不管你如何设置它,你必须创建一个新的空存储库作为你的远程目标。
一旦你创建一个空的存储库,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上,这将再次完成如下:
sudo apt-get update
sudo apt-get install git
一旦你安装了这个,你应该再次设置你的基本配置变量:
git config --global user.name "your name" git config --global user.email "email@domain.com"
下一步再次取决于你想要这台机器与git repo文件交互。
将主目录放在版本控制下
如果你想让整个主目录下的git版本控制,你应该开始一个空的git repo:
cd ~
git init
从这里,我们可以添加GitHub或GitLab repo作为这个仓库的起源:
git remote add origin http://git_lab_ip/your_gitlab_user/repo_name.git
在这一点后,如果我们已经在这台机器上有文件可能会与我们的repo中的冲突,我们将需要做一些有点不同。 例如, ~/.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。 这一次,我们将使用clone而不是初始化一个新的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设置,我们可以再次克隆repo。
与此方法的不同之处在于,由于我们希望存储库将其文件直接卸载到我们的主目录中,因此我们不会在克隆时检出任何文件:
git clone --no-checkout http://git_lab_ip/your_gitlab_user/configs.git
现在,我们需要告诉我们要我们的文件解压到位于两层以上的目录的git ~/configs/.git
目录(home目录):
cd configs
git config core.worktree "../../"
现在,我们可以显式检出文件。 同样,我们需要强制git覆盖我们当前的文件。 我们可以通过“重置”回到文件从我们的远程仓库的状态:
git reset --hard origin/master
您的配置文件现在应该在您的新计算机上可用。
结论
现在,您应该有几个选项,如何保持您的个人配置文件的版本控制。 通过不断地将配置文件更改提交到远程存储库,您应该能够快速,轻松地在远程机器上重新创建环境中最重要的部分。