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

在...创建的问题 Sat, Nov 19, 2016 12:00 AM

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

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

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

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

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

    
1576
  1. 一个非常有用的问题,但我很好奇为什么你不想跟踪.csproj文件的变化,这是任何一个重要的部分。项目。更改.csproj.user文件或任何.Publish.XML文件我完全可以理解不跟踪,但我很感兴趣为什么你不想跟踪.csproj ......
    2012-05-03 10:26:58Z
  2. 也许他们使用不同的IDE?
    2013-04-02 01:17:56Z
  3. 具有讽刺意味的是,我来到这个主题,因为我想从一个仓库中删除.suo文件但是将它们保存在本地。对于后代,.Net开发要求您将.csproj文件保存在repo中,并且应始终跟踪这些更改,除非您想要感受项​​目中任何其他开发人员的愤怒。如果不确定,请查看GitHub上的gitignore文件仓库: github.com /github/gitignore/blob/master/VisualStudio.gitignore
    2013-09-22 20:39:02Z
  4. @ Cupcake,你关联的问题是在这个问题的15天之后写的?也许你有另一个想法?
    2014-06-16 09:36:29Z
  5. @ marflar规范问题不一定必须是 最早的 ,只需 。我链接的那个有20个答案,而这个答案只有5个。
    2014-06-16 16:11:13Z
  6. 醇>
    17答案                              17 跨度>                         

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

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

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

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

    你可能想做什么:(来自 @Ryan Taylor回答

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

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

    完整答案位于以下网址: http://source.kohlerville.com/2009/02/untrack-files-in-git/

        
    1960
    2017-08-23 12:28:13Z
    1. “git rm --cached&lt; file&gt;”会删除&lt; file&gt;从版本控制,同时将其保留在工作存储库中。是否是你想要的......
      2009-06-02 00:03:52Z 四>
    2. 但是当其他人拉出存储库时,他们自己的* .csproj文件会被删除吗?因为如果我们希望文件不被跟踪,而不是删除。
      2011-06-01 13:07:07Z
    3. 如果您尝试删除目录中的所有文件,请将其与git ls-files结合使用:git ls-files | xargs git rm --cached - 这将删除给定git索引中的所有内容目录而不删除实际文件。
      2011-11-10 19:51:02Z
    4. git rm --cached -r <dir>以递归方式处理文件夹及其中的所有文件。
      2013-02-15 01:29:53Z
    5. 这将停止跟踪文件,在本地保存,但会导致删除给任何人拉
      2014-02-14 00:58:00Z
    6. 醇>

    如果您执行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)将是有用的:将构建划分为全局部分和本地覆盖。

        
    238
    2012-02-15 16:08:40Z
    1. 你如何撤消这个?
      2011-08-09 17:46:06Z
    2. git update-index --no-assume-unchanged file.csproj
      2011-08-09 21:30:54Z
    3. csproj是一个C#项目文件,它跟踪项目中包含哪些文件以及其他一些配置,它必须是源代码控制项目才能工作
      2013-12-04 15:20:42Z
    4. 这是唯一正确答案!我多年来一直在使用@araqnids答案,它完全按照要求解决这个问题。
      2014-05-27 04:31:38Z
    5. @ GreenAsJade:git ls-files -v将显示假设未使用小写指示符的文件(例如,对于缓存文件,为h而不是通常的H)。
      2014-11-27 03:42:34Z
    6. 醇>

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

        
    173
    2018-10-02 17:40:39Z
    1. 这个答案是最完整的 - 它提供了各种各样的解决方案。我正在使用的具体情况是在配置文件中嵌入了密码。我想传播模板文件,然后将密码添加到我的副本。带密码的副本应该被忽略,不能被覆盖。
      2016-11-20 16:23:56Z
    2. 如何在我的本地检查哪些文件适用于'assume-unchanged'或'skip-worktree'?
      2017-09-19 01:44:02Z
    3. @ SupawatPusavanno查看您之前选择的假设未更改或跳过工作树的文件查看此答案 stackoverflow.com/questions/42363881 /... - 它使用grepgit ls-files
      2017-09-19 17:15:33Z
    4. 非常好的答案。但是当我尝试切换到另一个分支时,git会抛出错误:错误:“您对以下文件的本地更改将被checkout覆盖.....”并且解决方案是在切换之前隐藏更改并在非切换时隐藏更改你回到分公司。
      2017-12-13 05:28:20Z
      醇>

      这是一个两步过程:

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

         
        git rm --cached 
        

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

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

      146
      2015-06-23 21:07:37Z
      1. 不,这将从跟踪中删除该文件,将其保存在本地,但会导致任何人拉删除该文件。
        2014-02-14 01:00:15Z
      2. 在我的情况下,我不小心添加了一个我不想跟踪的文件夹,所以这就是我需要的。
        2014-06-04 15:18:29Z
      3. 是的,这确实是问题的错误答案 - 但对于在搜索结果中找到这个问题的大多数人来说,这可能是正确的答案(比如我)。
        2017-08-10 13:16:30Z
      4. 醇>

      接受的答案仍然不适合我

      我用过

        

      git rm -r --cached。

           

      git add。

           

      git commit -m“fix .gitignore”

      此处找到答案

          
      89
      2014-09-18 05:44:44Z
      1. 该链接非常有用,特别是以递归方式删除.gitignore中的所有文件
        2016-04-13 10:44:58Z
      2. 我已经回到这里3次了,希望我能在下次之前提交记忆!
        2016-04-20 01:09:00Z
      3. 醇>

      忘记你的.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
      • 添加要跟踪的文件
      • 推送您的回购
      43
      2016-03-11 08:51:12Z
      1. 当你谈论删除或添加时,你忘了说何时何地。从曲目列表中删除?从存储库?从当地的项目空间?拉扯?在提交?在推?唉,这里的所有作者都有同样的问题。
        2016-03-11 08:50:41Z
      2. @ Gangnus我认为没有人'澄清'你想要做的那一点,因为很明显该文件实际上并没有从磁盘中移除或存储库。此答案指定命令的时间顺序。正如你的评论所暗示的那样,这并不神秘或不明白。
        2016-09-26 22:07:32Z
      3. 醇>

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

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

       
      git update-index --skip-worktree <file>
      
          
      23
      2017-05-23 11:54:41Z
      1. 不,不是真的:--skip-worktree用于将文件保留在存储库中但停止跟踪其更改。正如您的回答所说: - 当您指示git不要触摸特定文件时,skip-worktree非常有用,因为开发人员应该更改
        2015-11-09 12:29:22Z
      2. @ ErdalG。究竟。根据问题,他们想要忽略文件中的任何更改,但将文件保留在repo
        2016-08-31 11:05:55Z
      3. 同意@the_new_mr,--assume-unchanged--skip-worktree有类似的效果,但他们的目的完全不同。前一个用于通过欺骗git 不检查特定文件来加速git性能,而后者用于忽略特定文件的未来更改,这适用于运行时但必不可少的文件。
        2016-09-15 04:00:17Z
      4. 醇>

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

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

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

      e.t.c。

          
      21
      2013-11-07 13:18:52Z
      1. 这是一个非常好的解决方案,因为你想要一步一步地修复gitignore
        2016-05-04 20:35:19Z
      2. 醇>

      很多人建议你使用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:回去处理另一个功能。

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

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

          
      9
      2018-09-17 16:25:06Z

      防止通过git监视文件

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

      并将其还原为使用

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

      引用类似用例的回购 https://github.com/awslabs/git-secrets

          
      7
      2019-02-26 11:56:21Z

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

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

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

       
      git update-index --no-skip-worktree path/to/file
      
          
      6
      2018-06-12 22:10:25Z

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

      您可以使用此命令:

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

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

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

          
      0
      2015-04-06 13:47:02Z

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

      正确的解决方案:

      1. git rm --cached xxx
      2. 修改了.gitignore
      3. 醇>

        订单不变!

        .gitignore在修改后重新加载!

            
      0
      2017-03-24 17:05:36Z

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

      git update-index --assume-unchanged

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

          
      0
      2017-04-04 17:04:12Z

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

      在下文中,“excludedir”是我不希望更改的目录的名称。

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

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

      您可以使用modified:执行相同的操作。 renamed:有点复杂,因为你必须查看新文件名的->位,并按照下面->的描述执行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
      2018-05-26 00:05:11Z

      答案中提供了几乎 git无命令方法

      忽略 每个本地回购的某些文件:

      1. 创建一个文件~/.gitignore_global,例如在您的航站楼乘touch ~/.gitignore_global
      2. 运行git config --global core.excludesfile ~/.gitignore_global一次。
      3. 将要忽略的文件/目录路径写入~/.gitignore_global。例如modules/*.H,将被假定在您的工作目录中,即$WORK_DIR/modules/*.H
      4. 醇>

        忽略 单个本地回购的某些文件:

        1. 在repo中执行文件.git/info/exclude的上述第三步,即将要忽略的文件/dir路径写入.git/info/exclude。例如modules/*.C,将被假定在您的工作目录中,即$WORK_DIR/modules/*.C
      0
      2018-12-24 15:06:57Z
      经过很长一段时间的搜索,找到办法做到这一点。 alia a git command in .gitconfig。like in android studio project,checkout branch revert config file然后跳过它,checkout分支后使用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 && :     
      - 1
      2018-12-24 09:13:36Z
来源放置 这里