1

我的 Puppet 开发/测试服务器有一个 git 配置,如下所示:

  1. 开发人员在他/她的 /home 目录中有一个工作目录,其中实际上对配置进行了更改。
  2. 更改从每个工作目录推送到中央的裸存储库。
  3. 然后将更改拉入进行测试的开发目录中。
  4. 然后将更改拉入生产存储库。但是,在生产存储库中,我想忽略包含来自开发的主机特定信息的 manifests/ 目录。这个想法是生产存储库将包含其他清单或不包含清单,以便在其他地方控制清单。

当我从存储库中删除目录,然后在 .gitignore 文件中添加一个条目时,git status告诉我生产存储库有需要提交的更改(已删除的目录)并且是开发存储库之前的一个提交。

我发现通过将目录添加到 .gitignore 而将目录保留在文件系统上可以缓解这种情况。但是,如果我选择在生产清单目录中保留不同的主机列表,事情可能会立即变成梨形。

我能想到的唯一其他方法是为 Dev 清单和模块目录创建单独的存储库,这将允许我将模块更新拉入 Prod,同时不理会清单。然后,我可以从 /home 目录 repo 创建一个单独的存储库链,通过一个新的中央裸仓库仅用于生产清单,并从中单独提取。但是,我可以将其视为非初学者,因为我已经在 Production 目录下创建了 git 存储库。您不能让两个存储库为一个目录提供服务,对吗?

也许我必须将每个清单和模块目录的 git repo 放在这些目录下。

这是一个可行的方法吗?这个问题还有其他常见的解决方案吗?我对 git 还很陌生,所以我不知道它有多强大。

编辑:链接到代表我正在尝试做的图表:Puppet git repo diagram。您可以看到为什么我想在每个环境下保留一个单独的节点清单。

4

2 回答 2

0

从存储库中删除文件夹,将其添加到 .gitignore,然后提交更改。将该提交推送到您的中央裸仓库,您(几乎)就可以了。

删除文件夹时 git 显示未提交更改的原因是,您实际上已经更改了某些内容。你删除了文件夹。gitignore 并没有阻止这种情况的发生。实际上,如果您将跟踪文件添加到.gitignore,git不会忽略该文件(同样适用于文件夹)。.gitignore仅适用于未跟踪的文件。

因此,要取消跟踪存储库中的文件,您必须删除它们(或至少让 git 这么认为)并将它们添加到.gitignore. 您可以在不实际从工作目录中删除文件的情况下执行此操作:

git rm --cached <files>

实际文件将保留在工作目录中,但git status会显示为已删除。如果.gitignore同时添加它们,文件将永远保留在那里,而 git 不会注意到它。

但是,如果您提交该更改并且它被拉到其他地方,这些文件将被删除,因为 git 认为您实际上已经删除了它们。所以你需要取回这些文件(这不会让 git 再次跟踪这些文件,因为它们被添加到.gitignore):

git checkout HEAD~1 <files>

这将使文件回到那个单一的仓库中。您必须为每个拉动您在上面所做的提交的 repo 执行此操作。

于 2013-09-11T08:27:11.763 回答
0

而不是第二个回购,为什么不在 Prod 上有一个脚本:

  • 在 Prod git repo 上将 Dev 更改提取到它自己的分支中
  • 合并该分支 Dev on master,然后:
    • 对产品进行必要的更改,
    • 添加这些更改
    • 并将它们提交到masterProd 存储库中。
于 2013-09-11T05:47:00.630 回答