首页 文章

如何在Git中停止跟踪并忽略对文件的更改?

提问于
浏览
1481

我克隆了一个包含一些 .csproj 文件的项目 . 我不需要/喜欢我的本地 csproj 文件被Git跟踪(或者在创建补丁时被启动),但显然它们在项目中是必需的 .

我已将 *.csproj 添加到我的LOCAL .gitignore ,但文件已在回购中 .

当我输入git status时,它显示我对 csproj 的更改,我对跟踪或提交补丁不感兴趣 .

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

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

15 回答

  • 20

    为了节省时间,您添加到.gitignore的规则可用于删除多个文件/文件夹,即

    git rm --cached app/**/*.xml

    要么

    git rm --cached -r app/widgets/yourfolder/

    等等 .

  • 228

    There are 3 options, you probably want #3

    1. 这将为您保留本地文件,但会在其他人拉动时将其删除 .

    git rm --cached <file-name>git rm -r --cached <folder-name>

    2. 这是用于优化的,就像具有大量文件的文件夹一样,例如可能赢得't ever change. It tells git to stop checking that huge folder every time for changes, locally, since it won'的SDK有任何 . 如果文件/文件夹有上游更改(拉动时),将重置 assume-unchanged 索引并覆盖文件 .

    git update-index --assume-unchanged <path-name>
    

    3. 这是告诉git你想要自己的文件或文件夹的独立版本 . 例如,您不想覆盖(或删除) 生产环境 /暂存配置文件 .

    git update-index --skip-worktree <path-name>
    

    用git知道 git update-index will not propagate 是很重要的,每个用户都必须独立运行它 .

  • 137

    我假设您正在尝试从git中删除单个文件 . 因为我会推荐下面的命令 .

    git update-index --assume-unchanged

    Ex - git update-index --assume-unchanged .gitignore .idea / compiler.xml

  • 80

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

    另一个问题表明,它可能是需要的跳过工作树 .

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

    要告诉Git不要跟踪对本地文件/文件夹的更改(意味着git status不会检测到对它的更改),请执行以下操作:

    git update-index --skip-worktree path/to/file
    

    并告诉Git再次跟踪对本地版本的更改(以便您可以提交更改),执行:

    git update-index --no-skip-worktree path/to/file
    
  • 0

    要忽略对目录中所有文件(某种类型)的任何更改,我必须结合其中一些方法,否则如果以前不存在则创建文件 .

    在下面,“excludedir”是我希望不看更改的目录的名称 .

    首先,从更改跟踪缓存中删除任何现有的新文件(无需从文件系统中删除) .

    git status | grep "new file:" | cut  --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache
    

    您可以使用 modified: 执行相同的操作 . renamed: 有点复杂,因为您必须查看post -> 位以获取新文件名,并执行前 -> 位,如下面 deleted: 所述 .

    deleted: 文件证明有点复杂,因为您可以在本地系统上存在

    echo .deletedfiles >> .gitignore
    git status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
    cat .deletedfiles | xargs -d '\n' touch
    cat .deletedfiles | xargs -d '\n' git add -f
    cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
    cat .deletedfiles | xargs -d '\n' rm
    

    上面列表中的最后一个命令将再次从文件系统中删除文件,因此请随意省略 .

    然后,从该目录阻止更改跟踪

    git ls-files excludedir/ | xargs git update-index --skip-worktree
    git update index --skip-worktree excludedir/
    
  • 0

    如果你做 git update-index --assume-unchanged file.csproj ,git won 't check file.csproj for changes automatically: that will stop them coming up in git status whenever you change them. So you can mark all your .csproj files this way- although you'将不得不手动标记上游repo发送给你的任何新的 . (如果你在 .gitignore.git/info/exclude 中有它们,那么你创建的那些将被忽略)

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

  • 0

    这是一个两步过程:

    • 删除文件/文件夹的跟踪 - 但将它们保存在磁盘上 - 使用
    git rm --cached
    

    现在他们没有显示为“已更改”但仍显示为

    untracked files in  git status -u
    
    • 将它们添加到 .gitignore
  • 0

    我假设您正在询问如何删除特定文件夹或bin文件夹中的文件,而不是单独选择每个文件 .

    您可以使用此命令:

    git rm -r -f /<floder-name>\*

    确保您位于该目录的父目录中 .
    此命令将以递归方式"delete" bin /或build /文件夹中的所有文件 . 通过单词delete我的意思是git会假装那些文件是"deleted"并且不会跟踪那些文件 . git确实将这些文件标记为删除模式 .

    确保你的.gitignore准备好即将到来的提交 .
    Documentation : git rm

  • 4

    接受的答案仍然不适合我

    我用了

    git rm -r --cached . git add . git commit -m“fix .gitignore”

    here找到答案

  • 6

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

    Correct solution:

    • git rm --cached xxx

    • 修改了.gitignore

    Order invariant!

    .gitignore在修改后重新加载!

  • 38

    只需在要从版本控制中删除的每个文件上调用 git rm --cached 就可以了 . 只要您的本地忽略模式正确,您就不会在git status的输出中看到这些文件 .

    请注意,此解决方案会从存储库中删除文件,因此所有开发人员都需要维护自己的本地(非版本控制)文件副本

    要防止git检测到这些文件中的更改,您还应该使用以下命令:

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

    What you probably want to do: (来自@Ryan Taylor answer以下)

    这是告诉git你想要自己的文件或文件夹的独立版本 . 例如,您不想覆盖(或删除) 生产环境 /暂存配置文件 . git update-index --skip-worktree <path-name>

    完整的答案在此URL:http://source.kohlerville.com/2009/02/untrack-files-in-git/

  • 1856

    很多人建议你使用 git update-index --assume-unchanged . 实际上,这可能是一个很好的解决方案,但仅限于短期内 .

    您可能想要做的是: git update-index --skip-worktree .

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

    Difference between the first two options?

    • assume-unchanged 是临时允许您隐藏文件的修改 . 如果你想隐藏对文件所做的修改,修改文件,然后检查另一个分支,你将不得不使用 no-assume-unchanged 然后可能隐藏修改完成 .

    • skip-worktree 将跟随您,无论您检查的分支,您的修改!

    Use case of assume-unchanged

    它假定不应修改此文件,并在执行 git status 时为您提供更清晰的输出 . 但是当签出到另一个分支时,您需要重置标志并提交或存储更改 . 如果您在激活此选项的情况下拉动,则'll need to solve conflicts and git won' t自动合并 . 它实际上只隐藏修改( git status 不会显示标记的文件) .

    我喜欢使用它,当我只想停止跟踪更改一段时间提交与同一修改相关的一堆文件( git commit -a ) .

    Use case of skip-worktree

    您有一个包含参数(例如包括密码)的安装类,您的朋友必须根据其设置进行更改 .

    • 1:创建此类的第一个版本,填写您可以填写的字段并将其他人留空/ null .

    • 2:提交并将其推送到远程服务器 .

    • 3: git update-index --skip-worktree MySetupClass.java

    • 4:使用您自己的参数更新配置类 .

    • 5:回去处理另一个功能 .

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

    PS:做一个或另一个,但不是两个,因为你会有不良的副作用 . 如果你想尝试另一个标志,你应该先禁用后者 .

  • 123

    忘了你的.gitignore?

    如果您在本地拥有整个项目但忘记添加git ignore并且现在正在跟踪一些不必要的文件,请使用此命令删除所有内容

    git rm --cached -r .
    

    确保你是项目的根 .

    然后你可以照常做

    添加

    git add .
    

    承诺

    git commit -m 'removed all and added with git ignore'
    

    git push origin master
    

    结论

    希望这有助于那些必须对他们的 .gitignore 进行更改或者将它们全部忘记的人 .

    • 它删除整个缓存

    • 查看你的.gitignore

    • 添加要跟踪的文件

    • 推送你的回购

  • 20

    防止通过git监视文件

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

    并将其还原使用

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

相关问题