4

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

许多人将他们的 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文件(公共部分)并推送。更改应该很容易同步到其他机器(例如,通过拉取)

  • 如果我更改了myVar.shHOME 上的(不同部分)并推送,myVar.sh如果我在 Office 机器上拉动,它不应该影响 Office。

我在做什么:

现在我在 bitBucket 上有一个 Repo 和三个分支(H、O、C)。在 Home PC 上,我只玩 Home 分支。办公室,客户也是如此。

问题是,如果我在一台电脑上更改了通用部分,则更改在其自己的分支中,与其他两台同步有点困难。因为我永远不会合并这些分支。

我还考虑为不同的电脑创建不同的目录。例如

/.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 也可以。除了克隆、推送、拉取、向上、合并、ci 之外,我没有太多的 git 经验。

现在,我该怎么办

并且,感谢您阅读本文...


编辑更多关于不同部分

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

  • 跟踪点的 Xorg.conf

  • .hgrc 文件(因为在公司我们有自己的 repo、uid、pwd、proxy..)

  • 一些预配置的 systemd 模块,基本上是 .conf 文件。但特定于机器,例如 radeon.conf 仅适用于我的家用笔记本电脑。客户端 pc 根本没有安装 systemd。

    这就是为什么我考虑为 PC 设置不同的目录。

正如我现在所说,我有 3 个分支方式,并且myConf在这个目录中有一个目录getConf.sh,用于将点文件、不同的 confs 等复制到myConf. 事实上,它getConf.sh也属于不同的部分,因为所有电脑的脚本都不相同。

因此,我认为if-else/switchthensource在这种情况下可能不起作用。

昨天我刚拿了.zshrc,并尝试使示例简单。如果误导了各位,请见谅。

4

4 回答 4

5

我首选的方法是在同一个目录中为每个文件都有一个特定于主机的版本——类似于你的同一个文件多个目录,然后通过变量插值将它包含在我的主文件中。这~/.bashrc里面有这个:

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

据推测,这在 zsh 中甚至更漂亮,但想法是如果存在特定于主机的文件,则最后将其源,当然,适用于所有机器的任何内容都放在主 ~/.bashrc 本身中。

于 2013-01-16T21:03:28.387 回答
0

您可以在自己的分支中管理每个设置。您可以添加一个子模块(存储库中的存储库)来跟踪每个子模块中的公共文件。要同步它们,您可以

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 服务器获取或保存设置时。

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

于 2013-01-16T17:46:41.757 回答
0

我有一个类似的问题,并通过在相应的文件中分支来解决它。

这是一个小例子,展示了我如何PATH为我的 Mac 和其他计算机(内部.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允许类似的东西,这可能会有所帮助。如果没有,我会为每台计算机使用不同的文件并单独更新它们(也许使用基于某些共享部分生成这些文件的脚本?)。

于 2013-01-16T21:08:50.390 回答
0

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

  1. 经典分支

每个主机的分支,从额外的“香草”分支开始(您将在那里存储共享代码)。在每个分支中执行特定于主机的更改之后。常见的更改(并且只有 common)必须出现在 Vanilla 分支中并合并到其余部分

  1. MQ 补丁

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

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