我克隆了一个包含一些.csproj文件的项目.我不需要/喜欢我的本地csproj文件被Git跟踪(或者在创建补丁时被提起),但显然它们在项目中是必需的.
我已添加*.csproj到我的LOCAL .gitignore,但文件已经在repo中.
当我输入git status时,它会显示我csproj对跟踪或提交补丁不感兴趣的更改.
如何从我的个人仓库中删除这些文件的"跟踪"(但是将它们保存在源代码中以便我可以使用它们)以便在我执行状态(或创建补丁)时看不到更改?
是否有正确/规范的方法来处理这种情况?
ant*_*ony 2023
只需调用git rm --cached要从版本控制中删除的每个文件就可以了.只要您的本地忽略模式正确,您就不会在git status的输出中看到这些文件.
请注意,此解决方案从存储库中删除文件,因此所有开发人员都需要维护自己的本地(非版本控制)文件副本
要防止git检测到这些文件中的更改,您还应该使用以下命令:
git update-index --assume-unchanged [path]
Run Code Online (Sandbox Code Playgroud)
你可能想做什么:(来自@Ryan Taylor的答案)
- 这是告诉git你想要自己的文件或文件夹的独立版本.例如,您不想覆盖(或删除)生产/暂存配置文件.
git update-index --skip-worktree <path-name>
完整的答案在此URL中:http://source.kohlerville.com/2009/02/untrack-files-in-git/
ara*_*nid 241
如果你这样做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)将是有用的:将构建分为全局部分和本地覆盖.
Rya*_*lor 200
有3种选择,你可能想要#3
1.这将保留本地文件,但是当它们拉动时会将其删除.
git rm --cached <file-name> 要么 git rm -r --cached <folder-name>
2.这是为了优化,就像一个包含大量文件的文件夹,例如可能永远不会改变的SDK.它告诉git每次在本地停止检查那个巨大的文件夹,因为它没有任何更改.该assume-unchanged指数将被重置,文件(S)覆盖,如果有文件/文件夹上游的变化(当你拉).
git update-index --assume-unchanged <path-name>
Run Code Online (Sandbox Code Playgroud)
3.这是告诉混帐你想要的文件或文件夹的自己的独立版本.例如,您不想覆盖(或删除)生产/暂存配置文件.
git update-index --skip-worktree <path-name>
Run Code Online (Sandbox Code Playgroud)
重要的是要知道git update-index 不会使用git进行传播,并且每个用户都必须独立运行它.
rjh*_*a94 147
这是一个两步过程:
删除文件/文件夹的跟踪 - 但将它们保存在磁盘上 - 使用
git rm --cached
Run Code Online (Sandbox Code Playgroud)
现在他们不会显示为"已更改"但仍显示为
untracked files in git status -u
Run Code Online (Sandbox Code Playgroud)将它们添加到 .gitignore
Joe*_*oyd 44
如果您在本地拥有整个项目但忘记添加git ignore并且现在正在跟踪一些不必要的文件,请使用此命令删除所有内容
git rm --cached -r .
Run Code Online (Sandbox Code Playgroud)
确保你是项目的根.
然后你可以照常做
git add .
Run Code Online (Sandbox Code Playgroud)
git commit -m 'removed all and added with git ignore'
Run Code Online (Sandbox Code Playgroud)
git push origin master
Run Code Online (Sandbox Code Playgroud)
希望这有助于那些必须对其进行更改.gitignore或者将它们全部忘记的人.
the*_*_mr 25
正如其他答案所指出的,选择的答案是错误的.
另一个问题的答案表明,可能需要跳过工作树.
git update-index --skip-worktree <file>
Run Code Online (Sandbox Code Playgroud)
Pet*_*ter 21
为了节省时间,您添加到.gitignore的规则可用于删除多个文件/文件夹,即
git rm --cached app/**/*.xml
要么
git rm --cached -r app/widgets/yourfolder/
等等
shi*_*jin 12
防止通过git监视文件
git update-index --assume-unchanged [file-path]
Run Code Online (Sandbox Code Playgroud)
并将其还原回使用
git update-index --no-assume-unchanged [file-path]
Run Code Online (Sandbox Code Playgroud)
引用相似用例的仓库https://github.com/awslabs/git-secrets
很多人建议你使用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
您有一个包含参数(例如包括密码)的安装类,您的朋友必须根据其设置进行更改.
git update-index --skip-worktree MySetupClass.java无论分支如何,您所做的修改都会随之而来.警告:如果您的朋友也想修改此类,他们必须具有相同的设置,否则他们的修改将被推送到远程存储库.拉动时,文件的远程版本应覆盖您的文件.
PS:做一个或另一个,但不是两个,因为你会有不良的副作用.如果你想尝试另一个标志,你应该先禁用后者.
要告诉Git不要跟踪对本地文件/文件夹的更改(意味着git status不会检测到对它的更改),请执行以下操作:
git update-index --skip-worktree path/to/file
Run Code Online (Sandbox Code Playgroud)
并告诉Git再次跟踪对本地版本的更改(以便您可以提交更改),执行:
git update-index --no-skip-worktree path/to/file
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
662396 次 |
| 最近记录: |