首页 > 解决方案 > git 可以远程忽略文件,同时在本地包含它吗?

问题描述

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

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

标签: gittfsgitignore

解决方案


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

不。

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

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

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

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

...--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是.

CommitA的实际 ID,即大而丑陋的散列,取决于关于commit的一切A:这包括附加commit的所有文件,以及您指向的提交是 commit的父级A的事实。developA

如果您向A其他 Git 提交提交,则您有义务向他们提交所有与 commit 相关的文件A。如果他们没有所有文件,他们就没有 commit A

可以做一个新的提交——我们称之为——这A'很像 A只是略有不同。让我们A'让它没有文件。A但是,它的父级与 ' 的父级相同,并且它具有所有其他文件——请记住,每个提交都是所有文件的完整快照——A具有。让我们先做然后复制A'develop只是我们省略了一个文件:git checkout developA

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

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

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


推荐阅读