我克隆了一个包含一些.csproj文件的项目。我不需要/喜欢我的本地csproj文件被Git跟踪(或在创建补丁时被提起),但很明显,项目中需要这些文件。

我已经将*.csproj添加到我的LOCAL.gitignore中,但文件已经在repo中。

当我键入gitstatus时,它显示了我对csproj的更改,我对跟踪或提交补丁程序不感兴趣。

如何从我的个人存储库中删除这些文件的“跟踪”(但将它们保存在源中,以便我可以使用它们),以便我在执行状态(或创建补丁)时不会看到更改?

是否有正确/规范的方法来处理这种情况?


当前回答

这是一个两步过程:

删除对文件/文件夹的跟踪-但将其保留在磁盘上-使用git rm—缓存现在,它们没有显示为“已更改”,但仍显示为git状态为-u的未跟踪文件将它们添加到.gitignore

其他回答

这是一个两步过程:

删除对文件/文件夹的跟踪-但将其保留在磁盘上-使用git rm—缓存现在,它们没有显示为“已更改”,但仍显示为git状态为-u的未跟踪文件将它们添加到.gitignore

有3个选项;你可能想要#3

这将为您保留本地文件,但将在其他人拉动时删除该文件。git rm--缓存<文件名>或git rm-r--缓存<文件夹名>这是为了优化,就像一个包含大量文件的文件夹,例如可能永远不会更改的SDK。它告诉Git停止每次在本地检查巨大的文件夹是否有更改,因为它没有任何更改。如果文件/文件夹有上游更改(当您拉动时),则假设未更改的索引将被重置,文件将被覆盖。git更新索引——假设<路径名>不变这是为了告诉Git你想要自己的独立版本的文件或文件夹。例如,您不想覆盖(或删除)生产/登台配置文件。git更新索引--跳过工作树<路径名>重要的是要知道git更新索引不会随git传播,因此每个用户都必须独立运行它。

如果您执行git更新索引--假设file.csproj不变,git不会自动检查file.cspro是否有更改:这将在您更改它们时阻止它们以git状态出现。因此,您可以这样标记所有.csproj文件,尽管您必须手动标记上游回购发送给您的任何新文件。(如果您的.gitignore或.git/info/exclude中有它们,那么您创建的将被忽略)

我不完全确定.csproj文件是什么。。。如果它们与IDE配置类似(类似于Eclipse的.Eclipse和.classpath文件),那么我建议它们根本不应该是源代码控制的。另一方面,如果它们是构建系统的一部分(如Makefile),那么它们显然应该——并且一种获取可选本地更改的方法(例如从local.csproj a la config.mk)会很有用:将构建划分为全局部分和本地覆盖。

很多人建议你使用git更新索引——假设不变。事实上,这可能是一个很好的解决方案,但只是在短期内。

您可能想做的是:git更新索引--跳过工作树。

(第三个选项可能是:git-rm-cached。它将保留本地文件,但将标记为从远程存储库中删除。)

前两个选项之间的区别?

假设未更改是为了临时允许您隐藏文件中的修改。如果您想隐藏对文件所做的修改,修改文件,然后签出另一个分支,则必须使用no假设未更改,然后可能隐藏已完成的修改。跳过工作树将跟踪您签出的任何分支,并进行修改!

假设不变的用例

它假设不应修改此文件,并在执行git状态时提供更清晰的输出。但是,当签出到另一个分支时,您需要重置标志,并在此之前提交或隐藏更改。如果您在激活此选项的情况下进行拉取,则需要解决冲突,并且git不会自动合并。它实际上只隐藏修改(gitstatus不会显示标记的文件)。

当我只想暂时停止跟踪更改+提交一堆与相同修改相关的文件(gitcommit-a)时,我喜欢使用它。

跳过工作树的用例

你有一个包含参数(例如,包括密码)的设置类,你的朋友必须根据他们的设置进行更改。

1:创建该类的第一个版本,填写您可以填写的字段,并将其他字段留空/空。2:提交并将其推送到远程服务器。3:git更新索引--跳过工作树MySetupClass.java4:使用自己的参数更新配置类。5:回去做另一个功能。

无论分支如何,您所做的修改都将跟随您。警告:如果你的朋友也想修改这个类,他们必须具有相同的设置,否则他们的修改将被推送到远程存储库。拉动时,文件的远程版本应覆盖您的文件。

PS:做一个或另一个,但不能同时做两个,因为你会有不良副作用。如果要尝试其他标志,应首先禁用后者。

问题可能是由操作顺序引起的。如果您首先修改了.gitignore,然后修改了git-rm-cached-xxx,那么您可能不得不继续遇到这个问题。

正确的解决方案:

git rm--缓存的xxx修改了.gitignore

顺序不变!

修改后的.gitignore重载!