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


How to stop tracking and ignore changes to a file in Git?

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

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

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

如何从我的个人repo中删除这些文件的"跟踪"(但将它们保存在源文件中以便使用),以便在执行状态(或创建修补程序)时看不到更改?

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


只需对要从修订控制中删除的每个文件调用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 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)的方法将非常有用:将构建划分为全局部分和本地重写。


    有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一起传播,并且每个用户都必须独立运行它。


    这是一个两步的过程:

  • 删除文件/文件夹的跟踪-但保留在磁盘上-使用

    1
    git rm --cached

    现在它们不显示为"已更改",但仍显示为

    1
        untracked files in  git status -u
  • 添加到.gitignore


  • 接受的回答对我来说仍然不起作用。

    我用过

    git rm -r --cached .

    git add .

    git commit -m"fixing .gitignore"

    从这里找到答案


    忘了你的.gitignore?

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

    1
    git rm --cached -r .

    确保您是项目的根。

    那你就可以照常做了

    添加

    1
    git add .

    提交

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

    1
    git push origin master

    结论

    希望这能帮助那些必须对他们的.gitignore进行更改或将其全部忘记的人。

    • 它会删除整个缓存
    • 看看你的.gitignore
    • 添加要跟踪的文件
    • 推动回购


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

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

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


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

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

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

    E.T.C.


    很多人建议你使用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 && :