是否有任何版本控制系统具有“仅持续本地更改”功能?

时间:2009-10-26 16:00:57

标签: git version-control

这个问题在我玩git时遇到了,但我会问一般情况......

我只是想到了一个可能对版本控制很好的功能,但我不知道它是否存在或者它的名称是什么。我想称之为持续的局部变化。

假设我在svn中有一个配置文件,它有许多有用的非可重用的东西(因此必须在版本控制中),但有一个部分,每个人都需要自己编辑。可能是数据库配置,用户名和密码,或某些第三方软件的本地路径。您在这种情况下的选择是

  1. 在版本控制中编辑战争。只需不断更改文件,并希望其他人放弃编辑文件。

  2. 编辑它,但从不提交这些更改。他们只是坐在那里让你的“什么是新的/改变的”命令看起来很脏,你必须记住不要提交它。

  3. 模板吧。从版本控制中删除该文件,并在最后使用.template签入它的副本。在本地复制文件并将其重命名,并进行更改。

  4. 使用新的(虚构的?)持久性本地更改功能。进行更改然后发出record-changes-as-local-persistent命令,该命令会找出补丁,并在每次更新后重新应用补丁。

  5. 这个功能是否存在于任何地方(感觉就像git stash,但目的略有不同)? 如果它不存在,有没有充分的理由呢? (有人想过这件事,并认为这是一个坏主意吗?)

9 个答案:

答案 0 :(得分:6)

您可以使用主(或“供应商”)分支和本地分支在git中执行此操作。您的本地提交将在本地分支上进行,并在更改时在master上重新设置。如果您没有为本地分支指定遥控器,您将无法意外推动它;如果你不小心提交了你想要持久保存到本地分支的东西,那就选择掌握并从那里推送。

答案 1 :(得分:1)

您可以忽略版本控制中的任何配置文件。这是.gitignore文件。

例如,如果要忽略所有日志目录,可以使用以下命令在该文件中添加一行:

log/*

要忽略.DS_Store文件,请添加一行:

.DS_Store

然后,您可以在本地更新文件,您将永远不会在已修改但未提交的文件中看到它。如果您执行git add .,则不会将其添加到提交中。

如果您需要将配置文件放到git中,但只保留一个密码或var,那么我所做的就是在该配置文件中调用一个远程文件。这个文件包含我的密码。

例如,在rails项目中,我的数据库配置如下所示:

production:
 database: project_database
 username: database_user
 password: <%= File.read('path/to/my/password/file').chomp if File.readable? 'path/to/my/password/file' %>

文件“path / to / my / password / file”不在版本控制中 所以我的配置文件是版本化的。但密码取决于我们所在的机器。

它还具有以下优点:不允许任何人阅读您的版本控制中的密码。

答案 2 :(得分:1)

这可能对Visual Studio有点具体,但我认为大多数IDE都会有一些类似的功能。

在我的所有app / web配置中,设置都针对不同的环境进行了更改,我将它们拆分为自己的文件,以便我的主配置看起来像这样

  <dataConfiguration configSource="Config\Development\dataConfiguration.config" />
  <connectionStrings configSource="Config\Development\connectionStrings.config" />
  <appSettings configSource="Config\Development\appSettings.config"/>

然后对于每个文件,它类似于

<?xml version="1.0" encoding="utf-8" ?>
<dataConfiguration defaultDatabase="defaultDatabase"/>

之后,我为每个环境Dev / Staging / Prod等创建文件夹,并在每个文件夹中使用不同的子配置文件,以便可以将所有设置都检入TFS。我有我的Web部署项目设置,以便为每个版本配置提供适当的文件。稍后,当我配置TFS来管理我的版本时,只需复制正确的配置即可轻松实现。

此时您可以检查程序的基线,然后当开发人员只需要为自己更改内容时,他们不打算检查它们就可以轻松地使文件不是只读并编辑它。

答案 3 :(得分:1)

Darcs提供了此功能。您可以将更改的修补程序记录到本地存储库中的设置中,并且永远不会将其推送到另一个存储库。遗憾的是,FAQ states无法将补丁标记为仅限本地补丁。

虽然可以通过拥有第二个存储库来解决此限制,该存储库仅包含对您的存储库唯一的补丁。

答案 4 :(得分:0)

如果您可以将多个存储库组合到一个工作树中,那么这是可行的。最简单的解决方案是符号链接。

问题(使其变得困难)是VCS想要保留变更集的概念。因此,如果您将此类文件与常规版本文件一起提交 - 更改是否属于更改集?拥有相同的变更集意味着不同机器上的不同内容显然令人困惑。

使用多个存储库,您当然可以拥有一个存储库或另一个存储库的提交。这需要多少本地设置取决于VCS系统。例如,对于svn:externals,您需要在每台计算机上使用相同的file:存储库,但它们可以指向不同的文件集。使用符号链接,您可以以任何形式组织它(假设符号链接本身没有版本化)。

答案 5 :(得分:0)

我总是通过努力避免这种情况来解决这个问题。

我尽量让所有环境尽可能相似。唯一不同的通常是登录,有时是基础设施服务的URL(数据库,消息代理,企业数据服务等)。

所有开发人员的开发环境设置完全相同,并且检查开发环境的配置,以便开发人员可以从版本控制和构建中检查代码,而无需进一步调整。

签入CI和测试环境的密码和配置,因此构建和部署服务器可以自动在测试环境中启动系统。

生产密码从未签入(这通常是我工作的法律要求),管理员在生产环境中维护密码文件。

答案 6 :(得分:0)

我使用propagate命令在monotone上做了类似的事情。

简而言之,我有一个'开发'分支和一个'部署'分支。在已部署的分支中,配置有一些不同的设置(某些目录和DEBUG = False)。当我想部署时,我从开发到已部署的分支执行mtn propagate。然后在服务器上进行拉取和更新,因此工作区从其分支获取最新的更改,包括所有新开发,但尊重设置差异。

答案 7 :(得分:0)

你可以用SVN来做这件事。

如果您检查文件库中的文件并对其进行更改,然后再进行“更新”,则会从库中获取该文件的新副本,并对其应用更改。我经常使用它来配置文件。

这与您描述的内容不太相似,因为每次执行提交时,都必须排除配置文件。我想如果你忘记在某些时候这样做,你将用你当地的变化更新存储库,并让其他人感到悲伤。

当您确实需要更改配置文件的“公共”部分时,您必须单独检查,以便将“公共”更改与“本地”更改分开。

我也支持Chris Marisic描述的方案。我有几个Web应用程序,我创建了多个配置文件,程序根据环境动态决定使用哪个。

在一种情况下,配置文件包含外部文件的路径,我正在使用Windows服务器和Linux服务器,因此路径名称不同。所以我最终创建了一个“Linux配置”和一个“Windows配置”,然后根据我运行的操作系统进行选择。

在另一种情况下,启动时程序检查servlet上下文的名称(它是JSP / servlet应用程序),然后查找名为“WEB-INF / .properties”的文件。如果找不到,则加载默认名称。然后我在不同的上下文名称和生产版本下运行开发版本,每个版本自动选择正确的配置文件。

答案 8 :(得分:0)

Mercurial可以将本地文件添加到.hgignore,因此可以忽略 - 然后它不会弄乱您更改的文件或其他任何内容。