这个问题在我玩git时遇到了,但我会问一般情况......
我只是想到了一个可能对版本控制很好的功能,但我不知道它是否存在或者它的名称是什么。我想称之为持续的局部变化。
假设我在svn中有一个配置文件,它有许多有用的非可重用的东西(因此必须在版本控制中),但有一个部分,每个人都需要自己编辑。可能是数据库配置,用户名和密码,或某些第三方软件的本地路径。您在这种情况下的选择是
在版本控制中编辑战争。只需不断更改文件,并希望其他人放弃编辑文件。
编辑它,但从不提交这些更改。他们只是坐在那里让你的“什么是新的/改变的”命令看起来很脏,你必须记住不要提交它。
模板吧。从版本控制中删除该文件,并在最后使用.template签入它的副本。在本地复制文件并将其重命名,并进行更改。
使用新的(虚构的?)持久性本地更改功能。进行更改然后发出record-changes-as-local-persistent命令,该命令会找出补丁,并在每次更新后重新应用补丁。
这个功能是否存在于任何地方(感觉就像git stash,但目的略有不同)? 如果它不存在,有没有充分的理由呢? (有人想过这件事,并认为这是一个坏主意吗?)
答案 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,因此可以忽略 - 然后它不会弄乱您更改的文件或其他任何内容。