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

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

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

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

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


当前回答

在搜索了很长时间之后,找到一种方法。在android studio项目中,在.gitconfig.like中别名一个git命令,在签出分支之前还原配置文件,然后跳过它,签出分支之后使用sed将配置文件更改为我的本地配置。签出和修改属性=!git update-index--no-skip-worktree local.properties&&git checkout local.pproperties&&git-checkout$1&&git update-index--skip-worktree本地.properties&&sed-i''s/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g'local.properties&&:

其他回答

正如其他答案所指出的,所选答案是错误的。

另一个问题的答案表明,可能需要跳过工作树。

git update-index --skip-worktree <file>

这个答案链接到一篇文章(http://fallengamer.livejournal.com/93321.html)并引用了这篇文章,很好地概括了--假设不变和--跳过工作树之间的区别,如下所示:

--假设未更改假设开发人员不应该更改文件。此标志用于提高不更改文件夹的性能如SDK。

--当您指示git不要触摸特定文件,因为开发人员应该更改它时,skip-worktree非常有用。例如,如果上游的主存储库承载一些生产就绪配置文件,您不想意外提交更改对于这些文件,跳过工作树正是您想要的。

所有这些都归功于borealid的研究和回答。此处包含此信息纯粹是为了方便他人。

这是一个两步过程:

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

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

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

将.gitignore应用于当前/未来

此方法应用标准的.gitignore行为,不需要手动指定需要忽略的文件。无法再使用--exclude-from=.gitignore:/-以下是更新的方法:一般建议:从一个干净的repo开始-所有内容都已提交,工作目录或索引中没有挂起的内容,并进行备份!

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

如果您还需要从分支的提交历史记录中清除新忽略的文件,或者如果您不希望从将来的拉取中删除新忽略的文档,请参阅此答案。

防止git监视文件或路径

git update-index --assume-unchanged [file-path]

并将其恢复使用

git update-index --no-assume-unchanged [file-path]

参考类似用例的回购https://github.com/awslabs/git-secrets