如何对不应推送到远程存储库的控制文件进行版本控制?

时间:2019-08-07 19:13:09

标签: git

我正在与Rails API资源库上的团队合作,我们有一个.env文件,其中包含我们的环境变量。该文件包含在.gitignore文件中,因为环境变量包含敏感令牌,我们不想将其检入版本控制或推送至Github。

当我遇到与那些环境变量有关的bug时,这会带来一个问题。团队中的每个人似乎在本地设置中使用的环境变量集略有不同(或有时大不相同)(长话说,我知道这是根本原因,需要进行更改,但是作为一名新顾问,我的能力有限现在可以更改此功能。

我想到的一个短期解决方法是建立一个没有git的本地git存储库,仅用于.env文件(以及不应推送到远程master的任何类似文件)。至少这将使我能够回滚,检查差异以查看确切的更改,并阅读提交消息以提醒有关更改原因。但是,由于已经有了一个git存储库,可以跟踪大多数代码库的更改,因此我不确定是否可以创建第二个存储库。

我读了this post,但在涉及.gitignore文件时,似乎遇到了同样的问题。

我也考虑过使用git子模块,但是这些子模块仅用于子目录吗?如果两个.git/文件夹是同一个目录中的兄弟姐妹,它们也可以工作吗?

3 个答案:

答案 0 :(得分:1)

毫无争议(我认为)和不可争议(我认为):

  • 如果您需要对某些文件进行版本控制,则必须将它们放入版本控制系统中。
  • 如果VCS是分布式的(如Git一样)并且会将所有文件发送到其他地方(如Git一样-它们处于提交状态,则只能共享整个提交),这不适合您的用例。
  • 但是您要对其余文件使用Git。

结论:您至少需要两个VCS和/或存储库。

第二个VCS也可以是Git,只要您确定分发(至少以公共方式)第二个存储库即可。

子模块可以工作。子模块不过是对其他Git存储库的引用:本质上是URL和一个特定的提交哈希ID。但是,每个Git存储库都控制自己的工作树。如果必须将文件混合在一起(“位于同一文件夹中”),并且仍然要使用子模块,则有两种选择:

  • 与之交易(见下文);
  • 不要将Git工作树用作您的实际工作区域;
  • 如果您的系统支持符号链接,并且文件涉及的数量不多,则使一个存储库包含到另一个存储库工作树中实际存在文件的符号链接;或
  • 仅使用 符号链接,因此您看起来统一的工作树只是与所需子目录中文件的符号链接树。

请注意,如果您选择使用子模块,则可能希望将其构造为一个单独的超级项目,除了保留两个子模块(保留感兴趣的提交)之外,该项目什么都不做符号链接(如果您在此处使用最后一种方法)。这使得两个子模块完全相互独立,因为一个子模块不了解其超级项目。只有 third 存储库(超级项目)才知道还有两个其他的Git存储库,并且是由超级项目将子模块安排在相对符号链接的位置(如果使用的话)工作。

如果那太过分了,只需选择两个独立的Git存储库之一作为超级项目。另一个Git存储库将被克隆为超级项目的子目录。

关于“处理”

假设存储库A的提交仅包含公共文件,而存储库B的提交仅包含私有文件。克隆AB时,会得到两个不同的工作树。其中最多可以是path/to/files,但是您希望A B中的文件都出现在path/to/files中。如果A的工作树名为path/to/files

cd path/to; git clone url-of-A files

然后B的工作树肯定不是 path/to/files,并且从B 不会检出的文件最初出现在{{ 1}}。举例来说,假设B根本不是一个子模块,而您现在仍在path/to/files中运行:

path/to

您现在拥有git clone url-of-B sensitive-files (已将Git-repo克隆到files/*中)存储了从存储库A提取的文件,files/.git保留了从存储库B提取的文件。您现在可以手动操作,或使用脚本,复制或符号链接sensitive-files/*中管理的文件,以便可以通过格式为sensitive-files/*的名称来访问它们。

可以在files/*中列出出现在files/*中的副本或符号链接,以使它们不会添加到回购A的提交中。或者,如果您正在使用符号链接,请注意,files/.gitignore中的内容实际上只是路径名 A/sensitive-file-1。即使可以从任何地方访问repo A,也可以将 symlink 提交给repo A,因为无论谁获得它的副本,都只知道A中的程序可以读取和/或写入到名为../sensitive-files/sensitive-file-1的文件。该文件的实际内容不在sensitive-file-1中,而是在path/to/files中,因此它们根本不会出现在存储库A中。

答案 1 :(得分:1)

Git不需要将存储库或其工作树放在任何特定位置。您可以将其指向您正在使用的特定工作树和/或存储库,而不是查找它们而将使用它们。

因此,请保持原始存储库不变,并为您的.env文件保留边带存储库。

git init ~/orts.git
git config --global alias.orts '!git --work-tree "$PWD" --git-dir ~/orts.git'

然后您可以做

git orts add .env

答案 2 :(得分:0)

  

我们有一个.env文件...我们不想签入版本控制

所以...您有一个文件希望保持同步,但是不要不想使用版本控制。那么,使用其他东西吗?共享文件系统或小型网站。哎呀,如果没有路由器,那么简单的FTP就能解决问题。

您可以加密文件。

  

环境变量包括敏感令牌

这是我要重新考虑的部分,因为它很奇怪。真正敏感的数据永远不会在环境中。