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

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

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

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

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

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

848739 次浏览

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

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

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

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

你可能想做什么:(从下面@Ryan Taylor回复

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

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

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

如果您执行git update-index --assume-unchanged file.csproj,git不会自动检查file.csproj的更改:这将在您更改它们时阻止它们以git状态出现。因此,您可以以这种方式标记所有. csproj文件-尽管您必须手动标记上游仓库发送给您的任何新文件。(如果您在.gitignore.git/info/exclude中有它们,那么您创建的将被忽略)

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

这是一个两步过程:

  1. 删除文件/文件夹的跟踪-但将它们保留在磁盘上-使用

    git rm --cached

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

        untracked files in  git status -u
  2. Add them to .gitignore

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

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

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

e. t. c.

公认的答案对我仍然不起作用

我用

git rm-r--缓存。

git add

git提交-m"修复. gitignore"

这里找到答案

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

您可以使用以下命令:

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

确保您位于该目录的父目录中。
此命令将递归“删除”bin/或build/文件夹中的所有文件。通过删除这个词,我的意思是git会假装这些文件被“删除”并且这些文件不会被跟踪。git确实将这些文件标记为处于删除模式。

确保您的. gitignore已准备好迎接即将到来的提交。
文档:git rm

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

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

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

回答链接到一篇文章(http://fallengamer.livejournal.com/93321.html),并引用该文章,并对--seop-不变和--skip-worktree之间的区别进行了很好的总结,如下所示:

假设不变假设开发人员不应该更改文件。此标志用于提高不更改文件夹的性能像SDK一样。

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

他们的研究和回答都归功于0。在这里包含这些信息纯粹是为了方便他人。

忘了你的. gitignore?

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

git rm --cached -r .

确保你是项目的核心。

那你可以照常做

添加

git add .

提交

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

推送

git push origin master

结论

希望这能帮助那些不得不改变他们的.gitignore或忘记它的人。

  • 它会删除整个缓存
  • 看着你的. gitignore
  • 添加您要跟踪的文件
  • 推送到您的存储库

有3个选项;你可能想要#3

  1. 这将为您保留本地文件,但当其他人拉取时将删除它。

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

  2. 这是为了优化,就像一个包含大量文件的文件夹,例如可能永远不会更改的SDK。它告诉Git每次在本地停止检查那个巨大的文件夹是否有更改,因为它没有任何更改。如果文件/文件夹有上游更改(当你拉取时),assume-unchanged索引将被重置并覆盖文件。

    git update-index --assume-unchanged <path-name>
  3. 这是为了告诉Git您想要文件或文件夹的自己的独立版本。例如,您不想覆盖(或删除)生产/暂存配置文件。

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

    重要的是要知道git update-index不会传播使用Git,因此每个用户都必须独立运行它。

问题可能是操作顺序造成的。如果你先修改了. gitignore,然后修改了git rm--cache xxx,你可能不得不继续遇到这个问题。

正确解决方法:

  1. git rm--缓存xxx
  2. 修改了. gitignore

顺序不变!

. gitignore修改后重新加载!

我假设您正在尝试从git tack中删除单个文件。为此,我建议下面的命令。

git update-index#修改更新时间

Ex-git update-index--sea-不变的. gitignore.compiler.xml

防止通过git监控文件或路径

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

并将其恢复使用

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

用于引用类似用例的存储库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

您有一个包含参数(例如,包括密码)的设置类,您的朋友必须根据他们的设置进行相应的更改。

  • 1:创建此类的第一个版本,填写您可以填写的字段,并将其他字段留空/null。
  • 2:提交并推送到远程服务器。
  • 3:git update-index --skip-worktree MySetupClass.java
  • 4:使用自己的参数更新配置类。
  • 5:回到另一个功能上工作。

你所做的修改将跟随你的分支。警告:如果你的朋友也想修改这个类,他们必须有相同的设置,否则他们的修改将被推送到远程存储库。拉取时,文件的远程版本应该覆盖你的。

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

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

在下面的代码中,“除外目录”是我不希望看到更改的目录的名称。

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

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

renamed:有点复杂,因为您必须查看新文件名的post->位,并按照下面的deleted:所述执行前->位。

deleted:文件证明有点复杂,因为您似乎无法为本地系统上不存在的文件更新索引

echo .deletedfiles >> .gitignoregit status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfilescat .deletedfiles | xargs -d '\n' touchcat .deletedfiles | xargs -d '\n' git add -fcat .deletedfiles | xargs -d '\n' git update-index --assume-unchangedcat .deletedfiles | xargs -d '\n' rm

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

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

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

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

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

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

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

经过长时间的搜索,找到了一种方法。别名git命令在.gitconfig.like在Android工作室项目,结帐分支之前恢复配置文件,然后跳过它,结帐分支后使用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 && :

在这个回答中给出了几乎git免命令方法

去忽略每个本地存储库的某些文件:

  1. 创建文件~/.gitignore_global,例如在终端中使用touch ~/.gitignore_global
  2. 运行git config --global core.excludesfile ~/.gitignore_global一次。
  3. 将要忽略的文件/目录路径写入~/.gitignore_global。例如modules/*.H,它将被假定在您的工作目录中,即$WORK_DIR/modules/*.H

去忽略单个本地存储库的某些文件:

  1. 对repo中的文件.git/info/exclude执行上述第三步,即将您要忽略的文件/目录路径写入.git/info/exclude。例如modules/*.C,它将被假定为在您的工作目录中,即$WORK_DIR/modules/*.C

一行回答git update-index --assume-unchanged [path]

每当您有一个位于中央存储库中的文件并且本地repo.you需要对该文件进行更改但不能暂存/提交到中央存储库时,请使用此选项。此文件不应添加到.gitignore中。因为如果系统管理员引入文件中的新更改,高级开发人员需要分布在所有本地存储库中。

最佳示例:DB连接的配置文件。在中央存储库中,您将拥有生产数据库服务器的所有用户名、密码、主机、端口和值。但在本地开发中,您应该只使用本地或任何其他开发数据库服务器(您的团队已设置)。在这种情况下,您想更改配置文件,但不应提交到中央存储库。

最佳

将. gitignore应用于现在/未来

此方法应用标准. gitignore行为和不需要手动指定需要忽略的文件

不能再使用--exclude-from=.gitignore了:/-这是更新的方法:

一般建议:从一个干净的回购开始-提交的所有内容,工作目录或索引中没有任何未决内容,再做个备份

#commit up-to-date .gitignore (if not already existing)#this command must be run on each branchgit add .gitignoregit 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 branchgit 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 rm --fileName

git ls-files确保文件被删除或未跟踪

git commit -m "UntrackChanges"

git push