git可以远程忽略文件,同时将其包含在本地吗?

时间:2018-05-24 20:16:37

标签: git tfs gitignore

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

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

3 个答案:

答案 0 :(得分:2)

  

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

没有

更确切地说,不是你的想法。当你意识到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没有从他们那里获得任何新内容,你的{{1}名称仍然指向这些相同的提交。)

现在你在新分支和提交上做一些工作。让我们调用这个新的提交origin/*,以便我们可以讨论它(实际上它有一些很难看的哈希ID):

A

如果您从Git存储库...--o--o--o <-- master, origin/master \ o--o <-- develop, origin/develop \ A <-- work (HEAD) ,那么您可以提供的唯一新提交git push

提交A的实际ID,大丑陋的哈希,依赖于关于提交A的所有:这包括所有附加的文件 to commit A,以及A点提交develop父级的提交。

如果您将提交A提供给其他Git,则您有义务为每个提交A文件提供。如果他们没有所有文件,则他们没有提交A

可以进行新的提交 - 让我们调用此A - 这就像 A'一样,只是略有不同。让我们A使它没有文件。它的父节点与A'的父节点相同,并且它包含所有其他文件 - 请记住,每次提交都是所有文件的完整快照 - A具有。我们将A放在A'develop,然后复制git checkout develop,但我们省略了一个文件:

A

现在你可以让你的Git通过你的名字...--o--o--o <-- master, origin/master \ o--o <-- origin/develop |\ | A' <-- develop (HEAD) \ A <-- work 来调用另一个Git并提供它,而不是A,而是A'。如果他们选择接受它,您的Git现在会记住他们的 develop指向develop

这种特殊的方法使用起来相当痛苦。如果您可以找到其他方式,那不是可行的方法。

答案 1 :(得分:0)

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

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

另一个解决方案(虽然有点特别)是,如果你有3个开发人员在该网站上工作,你可以拥有一个ConnectionStrings.config,其中包含不同名称的本地环境的多个连接字符串,例如&#34; BobDevDB& #34;,&#34; AliceDevDB&#34;,&#34; JohnDevDB&#34;,每个名称前缀类似于他们的开发计算机名称或他们的Windows用户名,以便您可以在运行时选择正确的连接字符串。这样你就不必忽略任何东西,它总是有效。

答案 2 :(得分:0)

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

解决方案有两个部分。首先,我们必须更新所有活动开发分支的.gitignore,以便忽略配置文件。然后我们不得不从该分支的缓存中删除该文件。通过Visual Studio的团队资源管理器没有明显的方法,所以我们在命令行上使用了--cached选项。

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

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