Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 是否有任何版本控制系统有一个;“仅本地持续变化”;特征?_Git_Version Control - Fatal编程技术网

Git 是否有任何版本控制系统有一个;“仅本地持续变化”;特征?

Git 是否有任何版本控制系统有一个;“仅本地持续变化”;特征?,git,version-control,Git,Version Control,我在玩git时遇到了这个问题,但我会问一般情况 我只是想到了一个可能对版本控制很好的特性,但我不知道它是否存在,或者它叫什么。我想称之为持久性局部更改 假设我在svn中有一个配置文件,它有很多有用的不可复制的东西(因此必须在版本控制中),但有一个部分每个人都需要自己编辑。可能是数据库配置,或用户名和密码,或某些第三方软件的本地路径。你在这种情况下的选择是 在版本控制中编辑wars。只需不断更改文件,并希望其他人在您之前放弃编辑文件 编辑它,但永远不要提交这些更改。他们只是坐在那里让你的“What

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

我只是想到了一个可能对版本控制很好的特性,但我不知道它是否存在,或者它叫什么。我想称之为持久性局部更改

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

  • 在版本控制中编辑wars。只需不断更改文件,并希望其他人在您之前放弃编辑文件

  • 编辑它,但永远不要提交这些更改。他们只是坐在那里让你的“What's new/changed”命令看起来脏兮兮的,你必须记住不要提交它

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

  • 使用新的(虚构的?)持久本地更改功能。进行更改,然后以本地持久性命令的形式发出记录更改,这将生成一个修补程序,并在每次更新后重新应用修补程序

  • 这个特性是否存在于任何地方(感觉像是git隐藏,但用途略有不同)?
    如果它不存在,有没有理由不存在?(有人考虑过并认为这是个坏主意吗?

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

    问题是(这使得它很难)VCS想要保留变更集的概念。因此,如果您将这样一个文件与常规版本文件一起提交,那么这些更改是否属于变更集?在不同的机器上拥有相同的变更集意味着不同的事情,这显然令人困惑


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

    我一直通过努力避免这种情况来解决这个问题

    我试图使所有环境尽可能彼此相似。唯一不同的地方通常是登录,有时是基础设施服务(DB、MessageBroker、企业数据服务等)的URL

    所有开发人员的开发环境都是完全相同的,开发环境的配置是签入的,这样开发人员就可以从版本控制和构建中签出代码,而无需进一步的修改

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

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

    我使用
    传播
    命令在上执行类似操作


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

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

    例如,如果要忽略所有日志目录,请在该文件中添加一行:

    log/*
    
    要忽略.DS_存储文件,请添加一行:

    .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' %>
    
    生产:
    数据库:project_数据库
    用户名:数据库用户
    密码:
    
    文件“path/to/my/password/file”不在版本控制中。
    所以我的配置文件是版本连接的。但是密码取决于我们所在的机器


    它还有一个优点,就是在您的版本控制中没有密码供潜在的任何人读取。

    这可能对VisualStudio更为具体,但我认为大多数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来管理我的发布时,只要让它复制正确的配置,就可以轻松实现这一点

    在这一点上,您可以为程序签入基线,然后当开发人员只需要为自己更改一些他们不打算签入的内容时,他们可以轻松地使文件不再是只读的