【问题标题】:Can git ignore a file remotely, while including it locally?git 可以远程忽略文件,同时在本地包含它吗?
【发布时间】:2018-05-24 20:16:37
【问题描述】:

我正在开发一个 ASP.NET 项目,当我在我的桌面上进行本地开发时,我需要使用 connectionStrings 连接到数据库,但不想将它们签入网络上的 tfs 存储库。通过将 ConnectionStrings.config 文件放在 gitignore 文件中来排除它是很容易的。但这也阻止了它保存在我正在处理的分支的本地副本中,所以每次我在本地分支之间切换时,我的配置文件都会消失。

有没有办法在本地提交但远程忽略?

【问题讨论】:

    标签: git tfs gitignore


    【解决方案1】:

    有没有办法在本地提交但远程忽略?

    没有。

    更准确地说,不是你想的那样。当您意识到在某种程度上,Git 根本不关心 文件 时,您可以 做什么就变得显而易见了。 Git 关心的以及从存储库转移到存储库的是 commits。对于与提交图一起使用的 Git 算法,其中重要的部分是提交及其父/子关系。文件随手随走。

    假设您从存储库中的一组提交开始,您从其他存储库复制了这些提交(因此其他存储库也有这两个分支):

    ...--o--o--o   <-- master
             \
              o--o   <-- develop
    

    这里的每一轮o 代表一个提交。您创建了一个新分支 work,它指向 develop 指向的 same 提交:

    ...--o--o--o   <-- master, origin/master
             \
              o--o   <-- develop, origin/develop, work (HEAD)
    

    (origin/* 的名字是你 Git 记住你的 Git 在 他们的 Git 上看到的东西的方式,所以只要你的 Git 没有从他们那里得到任何新的东西,你的 origin/* 名字仍然指向这些相同的提交。)

    现在你在新分支上做一些工作并提交。让我们将这个新提交称为A,以便我们可以讨论它(实际上它有一些丑陋的哈希 ID):

    ...--o--o--o   <-- master, origin/master
             \
              o--o   <-- develop, origin/develop
                  \
                   A   <-- work (HEAD)
    

    如果您从您的 Git 存储库中git push,那么您可以提供给他们的唯一新的提交A

    提交A 的实际ID,丑陋的大哈希,取决于一切关于提交A:这包括所有附加的文件 提交A,并且你的develop 指向的提交是提交A 的父级。

    如果您将提交 A 提供给其他 Git,则您有义务将与提交 A 相关的每个 文件 都提供给他们。如果他们没有所有文件,他们就没有提交A

    可以做一个新的提交——我们称之为A'——这很像A,只是略有不同。让我们将A' 设为没有文件。不过,它的父级与A 的父级相同,并且它拥有所有other 文件——请记住,每个提交都是A 拥有的所有文件的完整快照。让我们将A' 放在develop 上,方法是使用git checkout develop,然后复制A,只是我们省略了一个文件:

    ...--o--o--o   <-- master, origin/master
             \
              o--o   <-- origin/develop
                 |\
                 | A'  <-- develop (HEAD)
                 \
                   A   <-- work
    

    现在你可以让你的 Git 调用另一个 Git 并通过你的名字 develop 提供它,而不是 A,而是 A'。如果他们选择接受它,您的 Git 现在会记住 他们的 develop 指向 A'

    这种特殊的方法使用起来相当痛苦。如果你能找到其他方法,这不是要走的路。

    【讨论】:

    • 谢谢,@torek。这绝对比我想要完成的事情更痛苦和复杂。但我很欣赏你的解释。
    【解决方案2】:

    如果您切换分支,忽略的文件将保留在原处。如果您将 ConnectionStrings.config 文件添加到所有分支(或共同祖先)上的 .gitignore,它应该始终存在(直到您执行完整的 git clean)。

    一个问题是,如果一个新人第一次克隆,该文件不存在。对于这种情况,有些人有一个模板示例配置文件,例如ConnectionStrings.config.example,其中包含一些您提交(而不是忽略)的假示例数据。在您第一次克隆后,请执行copy ConnectionStrings.config.example ConnectionStrings.config 并修改真实配置。

    另一个解决方案(虽然有些临时)是,如果您有 3 个开发人员在该站点上工作,您可以有一个 ConnectionStrings.config,其中包含多个本地环境的连接字符串,名称不同,例如“BobDevDB”、“ AliceDevDB”、“JohnDevDB”,每个名称前缀类似于他们的开发计算机名称或他们的 Windows 用户名,以便您可以在运行时选择正确的连接字符串。这样您就不必忽略任何事情,而且它始终有效。

    【讨论】:

      【解决方案3】:

      我们发现了问题。这个项目有几个开发分支,并不是所有的分支都将 ConnectionStrings.config 添加到他们的 .gitignore 中。所以有人在其中一个分支中工作,使用 ConnectionStrings.config 连接到数据库,当他们签入代码时,他们还签入了配置文件。

      解决方案有两个部分。首先,我们必须更新所有活动开发分支的 .gitignore ,这样它们就会忽略配置文件。然后我们必须从该分支的缓存中删除该文件。没有明显的方法可以通过 Visual Studio 的 Team Explorer 执行此操作,因此我们最终在命令行中使用了 --cached 选项。

      git rm -r --cached .\ProjectName\ConnectionStrings.config
      

      幸运的是,只有几个分支处于这种状态,并且很容易修复它们,将它们与源同步,并修复每个人的本地分支。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 2016-05-07
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多