我克隆了一个包含一些.csproj文件的项目。我不需要/不喜欢我的本地csproj文件被git跟踪(或在创建补丁时被提出),但很明显它们在项目中是需要的。
我已经将*.csproj添加到本地.gitignore中,但文件已经在repo中。
当我输入git状态时,它会显示我对csproj的更改,我对跟踪或提交补丁不感兴趣。
如何从我的个人repo中删除这些文件的"跟踪"(但将它们保存在源文件中以便使用),以便在执行状态(或创建修补程序)时看不到更改?
有没有正确/规范的方法来处理这种情况?
- 这是一个非常有用的问题,但我很好奇为什么您不想跟踪对.csproj文件的更改,这在任何项目中都是非常重要的一部分。对.csproj.user文件或任何.Publish.XML文件的更改我完全理解不跟踪,但我很好奇为什么你不想跟踪.csproj…
- 也许他们使用不同的IDE?
- 具有讽刺意味的是,我之所以来到这里,是因为我想从repo中删除.suo文件,但要将它们保存在本地。对于子孙后代,.NET开发要求您将.csproj文件保存在repo中,并且应该始终跟踪这些更改,除非您想对项目中的任何其他开发人员感到愤怒。如果不确定,请查看github上的gitigno re files repo:github.com/github/gitignore/blob/master/VisualStudio.gitigno‌&8203;re
- @纸杯蛋糕,你提到的问题是在这个问题15天后写的?也许你还有别的想法?
- @马弗拉经典问题不一定是最古老的问题,而是最好的问题。我联系的那个有20个答案,而这个只有5个。
- 这个问题的题目看起来像畅销书,这是故意的吗?
只需对要从修订控制中删除的每个文件调用git rm --cached就可以了。只要您的本地忽略模式是正确的,就不会看到这些文件包含在git状态的输出中。
请注意,此解决方案将从存储库中删除文件,因此所有开发人员都需要维护自己的文件本地(非修订控制)副本。
要防止Git检测这些文件中的更改,还应使用以下命令:
1
| git update-index --assume-unchanged [path] |
你可能想做什么:(从下面@ryan taylor answer)
This is to tell git you want your own independent version of the file or folder. For instance, you don't want to overwrite (or delete)
production/staging config files.
git update-index --skip-worktree
完整答案在以下网址中:http://source.kohlerville.com/2009/02/untrack-files-in-git/
- 根据手册:git rm-从工作树和索引中删除文件,这正是我不想做的。我错过什么了吗?但是,在查看git-rm的文档时,我发现--cached--cached:使用此选项仅从索引中取消存储和删除路径。无论修改与否,工作树文件都将单独保存。我想这就是我需要的,对吧?
- "git rm--cached"将从版本控制中删除,同时将其保存在工作存储库中。无论你想要什么…
- 是的,很好的电话——缓存。我已经习惯了生成大多数与构建相关的文件。我将编辑我的答复。
- 但是,当其他人拉入存储库时,他们自己的*.csproj文件会被删除吗?因为如果我们希望文件不被跟踪,但不被删除。
- 如果您试图删除一个目录中的所有文件,请将其与git ls文件结合起来:git ls-files | xargs git rm --cached——这将删除给定目录中git索引中的所有内容,而不删除实际文件。
- 下面是一个完整的例子,可以从跟踪中删除say all war文件。$git ls文件grep".war"xargs git rm--缓存
- git rm --cached -r 在文件夹及其所有文件上递归工作。
- 如果您git rm-cached.csproj,那么它将从版本控制中移除它。然后要将其添加到项目的.gitignore文件中。这应该允许每个人保留自己的.cdproj文件,即使他们拉。
- @克丽丝:或者在Unix上,你可以做find . -name"*.csproj" -exec git rm --cached {} \;。
- 下面的Araqnid回答更接近你的要求!!
- @我的同事刚刚说它删除了他的文件版本。他不太高兴。
- 这将停止对该文件的跟踪,在本地保留该文件,但会导致为任何拉入
- 它不仅会为拉取的任何人删除该文件,还会删除您的文件,如果您在删除之前签出修订,然后在删除之后签出修订。
- 能否有人提出一个解决方案/链接,不删除其他团队成员的存储库中的文件(如fmaz008和jackocnr所指出的)。
- 我不明白为什么这个问题被接受为答案,因为它不是一个答案。我会把阿拉克尼斯的回答标为正确的答案。
- 多年来我一直在使用@araqnids answer,它完全按照要求来解决这个问题。其他任何答案都不正确。
- 认为这很容易。多纳托
- 通过简单的实验,我看到在执行git rm --cache file1之后,应该将file1添加到.gitignore列表中,并执行git add .gitignore(如果尚未跟踪.gitignore)。一旦完成此操作,如果有人稍后提取,他/她的本地文件1将不会被删除。
- git rm-r-f[文件]
- @这不管用。正如所指出的,这将标记要删除的文件,当稍后有人提取/合并时,它将被删除。
- git ls-files -z myFolderToIgnore/ | xargs -0 git update-index --assume-unchanged将对myFolderToIgnore中的所有索引文件递归执行(从@chronial的答案复制)
- 在做这个之前,我还必须先做一个git reset HEAD。托比·贝雷斯福德的回答帮助了我
- 这个答案是错误的-运营商希望"我如何从我的个人回购中删除这些文件的"跟踪"(但要将它们保存在源代码中,以便我可以使用它们)
- 此更改将转到远程存储库,或者只在本地存储库上工作!?
如果您执行git update-index --assume-unchanged file.csproj操作,git将不会自动检查file.csproj是否有更改:这将在每次更改时阻止它们以git状态出现。因此,您可以用这种方式标记所有的.csproj文件——尽管您必须手动标记上游repo发送给您的任何新文件。(如果您的.gitignore或.git/info/exclude中有它们,那么您创建的那些将被忽略)
我不完全确定.csproj文件是什么…如果它们是符合IDE配置的(类似于Eclipse的.eclipse和.classpath文件),那么我建议它们根本不应该被源代码控制。另一方面,如果它们是构建系统的一部分(如makefiles),那么它们显然应该——以及一种获取可选本地更改(例如,从local.csproj a la config.mk)的方法将非常有用:将构建划分为全局部分和本地重写。
- 如何撤消此操作?
- git update-index --no-assume-unchanged file.csproj
- csproj是一个c项目文件,它跟踪哪些文件包含在您的项目和其他一些配置中,必须对其进行源代码控制,项目才能工作。
- 这是唯一正确的答案!多年来我一直在使用@araqnids answer,它完全按照要求来解决这个问题。
- is the meaning of the是什么文件是在the argument to the command字头?为什么不只是.csproj恩?
- greenasjade is not a"字头:恩,file.csprojis a file name。
- is there some that this Way You can has been done for探明的文件或文件,什么是this has done for a回购?我是位神经forgetting about this,我想知道,我为什么不让赫克this the updated文件以后,在线!
- 威尔:"greenasjade files that are assumed git ls-files -v秀unchanged与指标(例如lowercase hinstead of"一切照旧h高速缓存文件)。
- 小珍珠。这几乎deserves of自己提问!……做stackoverflow.com /问题/ 27162966 / & hellip;
- 文件@ araqnid if the is also as unchanged局部集中存放的是changed by another茶和茶的人会拉的更新文件?我不要求有信息文件,在其他模式下,but the might be changed at some点队列和卫星遥感皮卡11 need to the change
- 我不想mtpultz @的恩,TBH。我似乎unlikely to preserve,Git会当你拉你的版本,虽然-我指望一切照旧"脏Workspace"预警,或只是你的possibly恩将overwrite changes。实验的?
- i was looking for this also。git rm --cachedremoves EN from the回购。我知道,当我推回购,建立在那些谁不打破for get to the文件只是做git rm --cached
- 我不知道,但也许如果它能通过在线a word of this谨慎的方法。根据这stackoverflow.com /问题/答案/ 23097368 & hellip;从所hamano(of the"Git维护者、架构师、VCS)if that is a Git可以确定路径marked as has changed without incurring - unchanged承担额外的成本,(2)国家统计局的报告,它的储备是the right to the path has been modified"。基本不担保说,there is by the Git会abide -假设- unchanged旗。
- 我仍然tells confirm that this to the changes to ignore Git分支交换机的文件甚至当你
- 当检测到试图在不同的分支version of this has谁说:恩,你错误:文件档案局域网changes to the following摇篮overwritten模式:你file.csproj Please退房承诺changes or [他们之前你分支交换机。aborting
- 我的文件我改安忽视我,因为我在git add -f 和tracked appears as文件。我不想git cleanof them git rm --cached 和挤压。git update-index --assume-unchanged 挤压的感觉!
有3种选择,你可能需要3
1。这将为您保留本地文件,但会在其他人提取时将其删除。
git rm --cached 或git rm -r --cached 。
2。这是为了优化,就像一个文件夹中有大量的文件,例如可能永远不会改变的sdk。它告诉Git每次都停止检查那个大文件夹的更改,因为它不会有任何更改。如果对文件/文件夹进行上游更改(拉取时),将重置assume-unchanged索引并覆盖文件。
1
| git update-index --assume-unchanged <path-name> |
三.这是为了告诉Git您需要文件或文件夹的独立版本。例如,您不想覆盖(或删除)生产/分段配置文件。
1
| git update-index --skip-worktree <path-name> |
重要的是要知道git update-index不会与git一起传播,并且每个用户都必须独立运行它。
- 这个答案是最完整的——它提供了各种各样的解决方案。我正在处理的特定案例在配置文件中嵌入了密码。我想传播一个模板文件,然后将密码添加到我的副本中。带密码的副本应被忽略,而不是被覆盖。
- 如何在本地检查哪些文件适用于"假定不变"或"跳过工作树"?
- @supawatpusavano查看您之前为假设不变或跳过工作树选择的文件。请查看此答案stackoverflow.com/questions/42363881/&hellip;--它使用grep和git ls-files。
- 回答得很好。但是当我尝试切换到另一个分支时,Git抛出了错误:错误:"您对以下文件的本地更改将被签出覆盖…",解决方案是在切换前存储更改,然后在返回分支时取消存储。
这是一个两步的过程:
删除文件/文件夹的跟踪-但保留在磁盘上-使用
现在它们不显示为"已更改",但仍显示为
1
| untracked files in git status -u |
添加到.gitignore中
- 不,这将保存的跟踪文件从remove the EN,EN局部原因,but to be for任何人谁pulls消去。
- 在我的房子,在accidentally added folder,不想知道我的tracked,this is needed。
- 是的,它真的是错误的答案,但要as to the question是for most probably the right people find that this回答的问题在搜索结果(像我)。
接受的回答对我来说仍然不起作用。
我用过
git rm -r --cached .
git add .
git commit -m"fixing .gitignore"
从这里找到答案
- 这是非常有用的链接,especially to remove the files in the递归的.gitignore
- 这里的have returned时报承诺3,可以存储在hopefully to the next time!
忘了你的.gitignore?
如果您在本地拥有整个项目,但忘记添加Git Ignore,现在正在跟踪一些不必要的文件,请使用此命令删除所有内容
确保您是项目的根。
那你就可以照常做了
添加
提交
1
| git commit -m 'removed all and added with git ignore' |
推
结论
希望这能帮助那些必须对他们的.gitignore进行更改或将其全部忘记的人。
- 它会删除整个缓存
- 看看你的.gitignore
- 添加要跟踪的文件
- 推动回购
- 当你谈到删除或添加时,你会忘记说出何时何地。从曲目列表中删除?从存储库中?从本地项目空间?在拉力下移除?承诺?在推?唉,这里的所有作者都有同样的问题。
- @Gangnus我不认为有人"澄清"了你想表达的观点,因为很明显文件并没有从磁盘或存储库中删除。此答案指定命令的时间顺序。正如你的评论所暗示的那样,这并不是神秘的或不正确的解释。
如其他答案所指出的,所选答案是错误的。
另一个问题的答案表明可能需要跳过工作树。
1
| git update-index --skip-worktree <file> |
- 不,不是真的:--skip-worktreeis used to keep the but on the库文件停止跟踪其变化。当你回答说:-跳过-当你worktree is useful Git not to touch特异性教学文件曾经因为developers should change。
- erdalg @。确切的说因为是。根据朋友的问题,他们想要的任何文件,但keep the changes in the the repo文件
- 同意@u new_mr,--assume-unchanged和--skip-worktree具有相似的效果,但它们的目的完全不同。前者是为了通过愚弄git不检查特定文件来提高git性能,后者是为了忽略对特定文件的未来更改,这些文件适用于运行时但却是必需的文件。
为了节省一些时间,您添加到.gitignore中的规则可用于删除多个文件/文件夹,即
git rm --cached app/**/*.xml
或
git rm --cached -r app/widgets/yourfolder/
E.T.C.
- 这是很好的解决方案,在任何你想要的机会的原因Fix the gitignore步
很多人建议你使用git update-index --assume-unchanged。实际上,这可能是一个很好的解决方案,但只是在短期内。
你可能想做的是:git update-index --skip-worktree。
(第三种选择,你可能不想要的是:git rm --cached。它将保留您的本地文件,但将标记为从远程存储库中删除。)
前两个选项之间的区别?
- assume-unchanged是暂时允许您隐藏对文件的修改。如果要隐藏对文件所做的修改,请修改该文件,然后签出另一个分支,您必须使用no-assume-unchanged,然后可能会隐藏所做的修改。
- skip-worktree将跟踪您结账的任何分行,并进行修改!
assume-unchanged用例
它假定不应修改此文件,并在执行git status时为您提供更清晰的输出。但是当签出到另一个分支时,您需要重置标志并在更改之前提交或存储更改。如果在激活此选项的情况下拉,则需要解决冲突,并且Git不会自动合并。它实际上只隐藏修改(git status不会显示标记的文件)。
当我只想在一段时间内停止跟踪更改+提交一组与同一修改相关的文件(git commit -a)时,我喜欢使用它。
skip-worktree用例
您有一个包含参数(如密码)的设置类,您的朋友必须根据其设置进行相应更改。
- 1:创建这个类的第一个版本,填充您可以填充的字段,并将其他字段留空/空。
- 2:提交并将其推送到远程服务器。
- 3:git update-index --skip-worktree MySetupClass.java。
- 4:用您自己的参数更新您的配置类。
- 5:回到另一个功能上。
无论分支是什么,您所做的修改都将跟随您。警告:如果您的朋友还想修改这个类,他们必须有相同的设置,否则他们的修改将被推送到远程存储库。拉取时,文件的远程版本应覆盖您的。
附言:做一个或另一个,但不要两者兼而有之,因为你会有不良的副作用。如果要尝试另一个标志,应先禁用后者。
阻止Git监视文件
1
| git update-index --assume-unchanged [file-path] |
为了恢复原样,使用
1
| git update-index --no-assume-unchanged [file-path] |
类似用例参考报告https://github.com/awblabs/git-secrets
要告诉Git不要跟踪对本地文件/文件夹的更改(意味着Git状态不会检测到对它的更改),请执行以下操作:
1
| git update-index --skip-worktree path/to/file |
要让Git再次跟踪对本地版本的更改(以便提交更改),请执行以下操作:
1
| git update-index --no-skip-worktree path/to/file |
我假设您正试图从git tacking中删除一个文件。为此,我建议在下面的命令。
Git更新索引--假定不变
ex-git更新索引--假定不变.gitignore.idea/compiler.xml
在这个答案中给出了一个几乎免费的git命令方法:
要忽略每个本地回购的某些文件,请执行以下操作:
在终端中创建一个文件~/.gitignore_global,例如由touch ~/.gitignore_global创建。
运行一次git config --global core.excludesfile ~/.gitignore_global。
将要忽略的文件/dir路径写入~/.gitignore_global中。例如:modules/*.H,假定在您的工作目录中,即$WORK_DIR/modules/*.H。
要忽略单个本地回购的某些文件,请执行以下操作:
对repo中的文件.git/info/exclude执行上述第三步,即将要忽略的文件/dir路径写入.git/info/exclude中。例如:modules/*.C,假定在您的工作目录中,即$WORK_DIR/modules/*.C。
我假设您询问如何删除特定文件夹或bin文件夹中的所有文件,而不是分别选择每个文件。
您可以使用以下命令:
git rm -r -f /\*
确保您位于该目录的父目录中。
这个命令将递归地"删除"bin/或build/文件夹中的所有文件。删除这个词的意思是Git会假装那些文件被"删除",而这些文件不会被跟踪。git确实将这些文件标记为处于删除模式。
确保您的.gitignore已准备好迎接即将到来的提交。
文件:Git Rm
为了忽略对目录中所有文件(特定类型)的任何更改,我必须结合这些方法中的一些,否则,如果以前不存在这些文件,则会创建这些文件。
在下面,"excludedir"是我不希望看到更改的目录的名称。
首先,从更改跟踪缓存中删除任何现有的新文件(而不从文件系统中删除)。
1
| git status | grep"new file:" | cut --complement -d"" -f1-4 | grep"^excludedir" | xargs git rm --cache |
你也可以用EDOCX1做同样的事情。renamed:有点复杂,因为您需要查看新文件名的后->位,并按照下面针对deleted:的说明执行前->位。
deleted:文件证明有点复杂,因为您似乎无法更新本地系统上不存在的文件的索引。
1 2 3 4 5 6 7 8 9 10
| echo .deletedfiles >> .gitignore
git status | grep"deleted:" | cut --complement -d"" -f1-4 | grep"^excludedir"> .deletedfiles
cat .deletedfiles | xargs -d '
' touch
cat .deletedfiles | xargs -d '
' git add -f
cat .deletedfiles | xargs -d '
' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '
' rm |
上面列表中的最后一个命令将再次从您的文件系统中删除这些文件,因此请随意忽略这一点。
然后,阻止来自该目录的更改跟踪
1 2
| git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/ |
问题可能由操作顺序引起。如果您首先修改了.gitignore,然后修改了git rm--cached-xxx,则可能需要继续遇到此问题。
正确的解决方案:
git rm—缓存的xxx
修改了.gitignore
顺序不变量!
修改后重新加载.gitignore!
在搜索了很长时间后,找到一种方法。在.gitconfig中别名一个git命令。就像在android studio项目中一样,在签出分支之前,恢复配置文件,然后跳过它,在签出分支之后,使用sed将配置文件更改为本地配置。checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :