【问题标题】:How to delete .orig files after merge from git repository?从 git 存储库合并后如何删除 .orig 文件?
【发布时间】:2022-04-05 05:13:04
【问题描述】:

在合并期间如何在我的 git 存储库中检查 .orig 文件,这些文件现在显示在已修改和未跟踪的扇区中。但我不再希望这些文件出现在我的存储库中。如何做到这一点。

    modified:   Gemfile.lock.orig
    #   modified:   Gemfile.orig
    #   modified:   app/assets/images/bg_required.png.orig
    #   modified:   app/assets/javascripts/application.js.orig

    etc...

任何帮助将不胜感激。

【问题讨论】:

  • @ziu,我想删除我的存储库中已经存在的文件,由 git merge 或其他开发人员签入
  • 我错过了有关签入文件的部分。但是,.orig 文件是由 mergetool 编写的。在我看来,这听起来是一种不干净的冲突解决方案。
  • 您需要从整个历史记录中完全删除该文件吗?

标签: git


【解决方案1】:

在这种情况下,最好的解决方案是保持简单并独立于 git 删除这些文件:

cd /your/repo/directory
find . -name '*.orig' -delete 

或者,在 Windows/PowerShell 中,您可以运行以下命令

cd \your\repo\directory
Get-ChildItem -Recurse -Filter '*.orig' | Remove-Item

【讨论】:

  • 如果遇到谓词错误,请使用: find 。 -name '*.orig' | xargs rm -f
  • 作为警告,使用“find -delete”可能很危险。请检查目录(在本例中为“.”)是否正确,以确保您只删除要删除的内容
  • git clean -df 不这样做很痛苦。为什么我们必须手动清理它留下的垃圾?
  • Windows 怎么样?
  • @Panzercrisis 如果您使用的是 Windows,您可能已经有一个终端模拟器,您可以通过它与 Git 进行交互。我会推荐“gitforwindows”,它包含 BASH 和所有其他常用工具。
【解决方案2】:

试试git clean更多信息,你可以找到herehere

【讨论】:

  • 我可以清理未跟踪的文件,但是如何删除已经在存储库中的此类文件。
  • 你必须先从存储库中删除文件git rm <filename> 然后提交。在此之后将 *.orig 文件添加到 git 忽略。
  • 我认为这比标记为答案的解决方案更好。
  • git clean -i 真的很好。它将为您提供将被删除的文件列表,并为您提供如何处理列表的选项(过滤列表、能够删除列表中的所有内容以及其他一些选项)。
  • 您可以使用带有模式的 git clean 来帮助仅删除 *.orig 文件:git clean -f -e '*.*' -e '!*.orig' 只有一个排除模式,但它对否定模式有一点支持。所以我们可以排除所有文件*.*,然后否定只排除*.orig文件。
【解决方案3】:

你可以这样做:

git config --global mergetool.keepBackup false

更多信息,请参考Git mergetool generates unwanted .orig files

【讨论】:

    【解决方案4】:

    不幸的是,git clean 对我不起作用,因为我已将 *.orig 添加到我的全局 gitignore 文件中,因此它们也被 clean 忽略了。即使运行 git clean -x 也不好,因为我不希望 all 我忽略的文件被删除。 git clean -i 很有帮助,但我真的不想检查每个文件。

    但是,我们可以使用排除模式并否定匹配。使用此命令预览:

    git clean -e '!*.orig' --dry-run
    

    然后,当您有信心时,传递force 标志以真正删除它们:

    git clean -e '!*.orig' -f
    

    基于leorleor's comment

    【讨论】:

      【解决方案5】:

      您可以使用 .gitignore 忽略文件

      只需将 *.orig 放在此处所示的列表中

      https://help.github.com/articles/ignoring-files

      要删除当前文件,您可以创建 shell 脚本并从项目文件夹中运行,如下所示

      for file in `find *.orig -type f -print`
      do
         echo "Deleting file $file"
         git rm $file -f       
      done
      

      【讨论】:

      • 虽然他肯定能做到,但在这里做的不是正确的:)
      • 我认为这是一个好主意,因为它可以保留备份但不会干扰暂存文件
      • @akazemis - 你会这么认为,但是当你搜索代码时,你看到的搜索结果是你想要的两倍(这会让你对最新代码中的内容产生错误的看法)。这太罕见了,我宁愿忍受没有原始文件的危险。最好只是定期提交。
      • @SridharSarnobat 您可以在 grepping 期间忽略这些文件
      【解决方案6】:

      git rm Gemfile.lock.orig 以及您不需要的其余文件。 git commit --amend

      要完全删除这些斑点, git gc --prune=0 --aggressive

      【讨论】:

      • @linquizebut git rm Gemfile.lock.orig 的提交将使用修正进入最后一次提交,对吗?有没有其他方法可以不提交此类文件?
      【解决方案7】:

      对于我来说git clean -f 删除了所有 *.oig 文件。并保留之前已经存在的那些。

      这就是它(几乎)合并后的样子:

      $ git status
      On branch feature/xyz
      Your branch is ahead of 'origin/feature/xyz' by 568 commits.
        (use "git push" to publish your local commits)
      
      Untracked files:
        (use "git add <file>..." to include in what will be committed)
      
          .idea/codeStyles/
          .idea/misc.xml.orig
      

      .idea/codeStyles/ 在合并之前已作为未跟踪文件存在。 .idea/misc.xml.orig(以及更多)必须被删除。

      => 使用git clean -f

      $ git clean -f
      Removing .idea/misc.xml.orig
      

      导致:

      $ git status
      On branch feature/xyz
      Your branch is ahead of 'origin/feature/xyz' by 568 commits.
        (use "git push" to publish your local commits)
      
      Untracked files:
        (use "git add <file>..." to include in what will be committed)
      
          .idea/codeStyles/
      

      【讨论】:

      • 确保在运行此命令之前使用 git add 添加了您需要的文件。我不小心运行了这个命令,它删除了所有未添加到 git 的文件(我想要的)
      【解决方案8】:

      你可以简单地做git status -s | grep "\.orig$" | awk '{print $2}' | xargs -n1 -r echo rm

      TL;DR;

      git status -s 允许您获取与索引有关的所有修改/丢失的文件

      grep "\.orig$"过滤掉文件,保留“.orig”结尾

      awk '{print $2}' 列出文件名(跳过 git 信息,例如 A、M、??)

      xargs -n1 -r echo rm 在每个参数上打印删除命令(-n1:一次一个,-r:空时跳过)只需复制和粘贴命令,仔细检查要删除的文件。

      【讨论】:

      • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
      【解决方案9】:

      您可以使用预提交挂钩自动执行此过程。为此,只需进入您的项目文件夹,然后搜索隐藏文件夹.git。 在里面你会找到hooks目录,打开它并cr8一个名为pre-commit的文件,下一个包含:

      echo "Looking for .orig files to remove"
      pwd=$(pwd)
      find . -name '*.orig' -delete 
      echo "Done removing .orig files"
      

      现在它会在你提交之前清理 orig 文件,所以没有必要将它保存在 gitignore 中。

      【讨论】:

        【解决方案10】:

        对于那些使用 Windows 计算机 的人,您可以在 PowerShell 中执行此命令。

        ls -r *.orig | rm -f
        

        或者,如果您更喜欢详细的 PowerShell

        Get-ChildItem -Recurse *.orig | Remove-Item -Force
        

        【讨论】:

          【解决方案11】:

          git rm &lt;file&gt;

          http://git-scm.com/docs/git-rm

          还将您想要忽略的文件/目录添加到您的 .gitignore 文件中。

          【讨论】:

          • git rm &lt;file&gt; &lt;file&gt; 列出它们。
          • 然后你需要列出所有文件,或者使用 find 之类的工具将它们传递给 git rm,或者使用 shell glob 并循环它们。 Git 不会复制这个标准的 Unix 命令行功能。
          • orig 文件没有添加到仓库中,所以不需要使用git rm,只需使用rm 代替
          猜你喜欢
          • 2011-01-04
          • 2018-08-13
          • 2010-09-11
          • 1970-01-01
          • 2011-03-28
          • 1970-01-01
          相关资源
          最近更新 更多