部分分支或部分合并或其他方式来帮助我同步dotfiles?

时间:2013-01-16 17:42:33

标签: git shell mercurial dotfiles

我不知道如何使我的要求在标题中缩短,对不起,如果它没有意义。我会在这里解释一下:

许多人将他们的dotfiles放在bitbucket或github上,以方便以后的安装或配置,在不同的PC上同步。我做了同样的事情,但是我想做一些特别的事情,我不确定mecurial / git是如何帮助的。

我有什么:

我有3台机器,比如Home,Office和Client,所有linux操作系统(可能是不同的发行版)。为了使示例简单,请说我只想将.zshrc中的一个文件放入repo。问题是,三个操作系统有不同的系统变量(或其他设置)。例如

  • Office安装了JBOSS,然后在.zshrc我需要导出JBOSS_HOME var。
  • 客户端已安装Oracle,然后导出不同的变量集。
  • Office必须导出HTTP_PROXY,但HOME不是,客户端也需要它,但代理值不同等。

现在我所做的是,我将这些特定于机器的设置(主要是导出,别名声明)提取到另一个文件,比如myVar.sh。并在.zshrc

的末尾找到它

因此3台机器具有共同部分(相同.zshrc)和不同部分(myVar.sh)。

我想要的是什么:

    在任何机器上
  • ,如果我找到一些不错的设置,我会更改.zshrc文件(公共部分)并推送。这些更改应该很容易与其他机器同步(例如,拉动)

  • 如果我更改了HOME上的myVar.sh(不同部分)并推送,那么如果我拉上Office计算机,则不应影响Office的myVar.sh

我在做什么:

现在我在bitBucket上有一个Repo,还有三个分支(H,O,C)。在家用电脑上,我只是玩Home分支。对于Office,Client也是如此。

问题是,如果我在一台PC上更改了公共部分,则更改位于其自己的分支中,有点难以同步到另外两个。因为我永远不会合并那些分支。

我也想到为不同的pc制作不同的目录。 e.g。

/.zshrc
|--/HOME/myVar.sh
|--/Office/myVar.sh
|--/Client/myVar.sh

并编写shell脚本,例如检查$ HOST以决定将myVar.sh写入哪个目录。但我怀疑,如果这是实现我的目标的最佳方式。当我看到我的dotfiles目录时,我看到所有3个人的设置。我应该小心并输入正确的文件来读取文件。

在现实世界中,公共部分包含的内容远远多于.zhsrc(tmux,vimrc,xdefault ..),不同的部分也是如此。

我不知道我们能以某种方式制作部分分支或在存储库上进行部分合并......

我使用hg远远超过git,如果hg可以解决它我更喜欢hg,如果没有,git也可以接受。我没有太多的git经验,除了克隆,推,拉,上,合并,ci。

现在,我该怎么做

并且,感谢您阅读此内容......


编辑有关不同部分的更多信息

我要感谢所有人给我答案。如上所述,我真机中的不同部分并不像myVar.sh那么简单。例如,我将我的公司 - 笔记本电脑(Office)带到不同的客户端(大约有6个客户端,并非所有客户端都为我们提供PC,这很好,因为我可以随处使用Linux),并为每个客户配置打印机。我也会把这些配置放在Repo中。因为如果有一天我必须刷新我的系统,或硬盘失败,我可以很容易地设置这些打印机。其他属于不同部分的东西,但我不能简单地“源xxx”像

  • 跟踪点的Xorg.conf
  • .hgrc文件(因为在公司我们有自己的仓库,uid,pwd,代理..)
  • 一些预配置的systemd模块,基本上是.conf文件。但是机器特定的,例如radeon.conf仅适用于我的家用笔记本电脑。并且客户端PC根本没有安装systemd。

    这就是我为PC考虑不同目录的原因。

正如我现在所说的那样,我有3个分支方式,并且在myConf这个目录中有一个getConf.sh目录,用于将dotfiles,不同的confs等复制到myConf。实际上getConf.sh也属于不同的部分,因为所有pc的脚本都不相同。

因此,我认为if-else/switch然后source在这种情况下可能无效。

昨天我刚拿了.zshrc,试着让这个例子变得简单。如果它误导了你们,对不起。

4 个答案:

答案 0 :(得分:5)

我首选的方法是在同一目录中为每个文件设置一个特定于主机的版本 - 类似于同一个文件的多个目录,然后在我的主文件中通过变量插值包含它。所以~/.bashrc就在其中:

if [ -f ~/.bashrc-$HOSTNAME ] ; then
     source ~/.bashrc-$HOSTNAME
fi

据推测,在zsh中它甚至更漂亮,但是这个想法是在最后是否存在特定于主机的文件,当然所有适用于所有机器的东西都在主〜/ .bashrc本身。

答案 1 :(得分:0)

您可以像往常一样管理其自己的分支中的每个设置。您可以添加一个子模块(repo中的repo),用于跟踪每个子模块中的公共文件。要同步它们,您可以

git checkout otherbranch -- path/to/common/script && git submodule update

要进行设置,请执行以下操作:

在您的主目录中

添加.gitignore文件。用*忽略一切。在该条目之后,排除要保留的点文件!例如.ssh /。

现在将其变成回购很容易。

git init repostart
mv repostart/.git .
rm -rf repostart
git add .gitignore .ssh
git commit -m "initial start of syncing my settings"

现在将跟踪.ssh /中的每个更改。在您的情况下,如果您愿意,可以排除.bashrc和.bash_profile。

现在你可以按照github或bitbucket(免费私人回购)推送和拉动的标准程序。

git remote add origin <url to bitbucket repo>
git push -u origin master

现在您已在服务器上进行设置。在你的其他机器上:

cd ~
git clone <path to your settings> settings
mv settings/.git . 
rm -rf settings
git pull origin master -t

-t和-u选项设置跟踪,因此您可以

git push
git pull

当你需要从bitbucket服务器获取或保存设置时。

现在,为了使您的共同部分同步,您可以阅读progit.org/book中关于子模块的这一简短章节。见第6章第6节。

答案 2 :(得分:0)

我遇到了类似的问题,并通过分支相应的文件解决了这个问题。

以下是一个小例子,展示了我如何为我的Mac和其他计算机(PATH内)导出不同的.bashrc值:

MAC=0
if [ -x "/System/Library/CoreServices/Finder.app/Contents/MacOS/Finder" ]; then
  MAC=1
fi

if [ $MAC -eq 1 ]; then
  export PATH=~/bin/:/sw/bin:$PATH
else
  export PATH=~/bin/:/sbin/:$PATH
fi

如果您的.zshrc允许类似的内容,这可能有所帮助。如果没有,我会为每台计算机使用不同的文件并单独更新它们(可能是根据某些共享部分生成这些文件的脚本?)。

答案 3 :(得分:0)

嗯,纯粹以Mercurial为中心的解决方案

  1. 经典分支
  2. 每个主机的分支,从额外的“vanilla”分支开始(在那里你将存储共享代码)。在每个分支中执行后,您将执行特定于主机的更改。常见的更改(以及仅限常见)必须出现在Vanilla分支中并合并到其余部分

    1. MQ补丁
    2. 单个分支,目的与p.1中的Vanilla相同(“changesets包含公共碱基”)。所有可变的特定于主机的更改都存储在mq-patch队列的集合中(或者,对于新的Mercurial,可能存储在队列中)。如何组织补丁堆栈完全是您的责任范围:

      • 您可以为每个主机使用一个队列和完整的补丁集(基于名称的分离),即使某些不同的补丁是另一个补丁的克隆。结果:为主机准备实际文件​​集的操作非常简单,您必须应用所有NAME- *补丁
      • 功能分离:每个补丁都用于单个任务(BOSS,ORACLE,PROXY,PROXY-CONFIG ......)。结果:更少的补丁,来自块的文件的逻辑组合,可扩展用于更宽的主机集而不改变内部逻辑
      • 单独的队列:每个主机都有自己的队列。结果:“外来”补丁永远不会应用于主机,缺陷 - 更难(或不可能)补丁在队列之间交换,功能性克隆如版本“全套”(实际上它是“全套”的变化,具有更强的分离)