【问题标题】:How do you make Git ignore files without using .gitignore?如何在不使用 .gitignore 的情况下让 Git 忽略文件?
【发布时间】:2010-10-13 19:10:23
【问题描述】:

由于外部奇怪的限制,我无法修改存储库的 .gitignore。除了修改.gitignore 之外,有没有办法忽略文件​​和目录?即使它是一个全局解决方案,例如将应用于我所有存储库的全局配置。

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    如果您可以修改.git/info/exclude,您可以将相同的规则放在那里。但该文件仅在您的本地存储库中。

    【讨论】:

    • 听起来这可能是你最好的选择;让我们从本地存储库中排除文件。
    • 这如何与子模块一起工作?子模块中没有.git 目录...
    • @yourfriendzak 子模块的.git 文件夹实际上位于parent_repo/.git/modules/submodule_name。所以你会编辑parent_repo/.git/modules/submodule_name/info/exclude
    • 这个 imo 是快速简短的回答。谢谢!
    【解决方案2】:

    有三种方法可以告诉 GIT 忽略哪些文件:

    • .gitignore文件
    • $GIT_DIR/.git/info/exclude
    • 通过core.excludesfile 设置指向的文件

    后两点可以解决你的问题。

    如需更多信息,请参阅gitignore(5)

    【讨论】:

      【解决方案3】:

      不要忘记,根据gitignore,Git 考虑的不同“忽略模式源”中存在优先顺序:

      • 从命令行读取支持它们的命令的模式。
      • 从与路径相同的目录或任何父目录中的 .gitignore 文件读取的模式,较高级别文件(直至根目录)中的模式被较低级别文件中的模式覆盖,直至目录包含文件。
      • $GIT_DIR/info/exclude读取的模式。
      • 从配置变量core.excludesfile指定的文件中读取的模式。

      最后两个可以解决您的问题,但是:

      • 它们不会复制到远程存储库
      • 它们的模式可以被其他来源覆盖

      (另见SO question


      另外两个解决方案涉及更新索引 (git update-index):

      但是,当您签出另一个分支或git pull 时,“忽略”状态可能会被重置。因此,另一种选择:

      两者的区别在“Git - Difference Between 'assume-unchanged' and 'skip-worktree'”中有说明。

      【讨论】:

      • 您可以使用update-index --assume-unchanged @see stackoverflow.com/a/25253144/292408
      • @ElijahLynn 当然。你也有update-index --skip-work-tree。我已经编辑了答案,以添加一些指向我的旧答案的链接,以说明这两个 update-index 命令。
      【解决方案4】:

      忽略对跟踪文件的本地更改: git update-index --assume-unchanged my-file.php

      忽略对跟踪文件的本地更改: git update-index --no-assume-unchanged my-file.php

      来源:git help update-index

      --[no-]assume-unchanged
                 ...
                 This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
                 files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
                 modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
                 changed upstream, you will need to handle the situation manually.
      

      【讨论】:

        【解决方案5】:

        如果您只想在存储库中有一些本地文件并且子目录位置灵活,您可以将文件放在tracked_dir1/tracked_dir2/untracked_dir/,然后添加tracked_dir1/tracked_dir2/untracked_dir/.gitignore,内容如下:

        *

        $ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
        *
        <Ctrl+D>
        

        【讨论】:

          【解决方案6】:

          可以使用全局的gitignore方法,而不是在项目中修改那个 https://help.github.com/articles/ignoring-files/#create-a-global-gitignore

          【讨论】:

            【解决方案7】:

            我遇到过类似的情况,所以我添加了我没有提到的首选解决方案。在这种情况下,git update-index --assume-unchanged 的问题在于您不能对未跟踪的文件执行此操作。你说

            我无法修改存储库的 .gitignore。

            我将假设您的意思是您不能将对 .gitignore 的任何更改推送到原点。如果是这种情况,您可以将未跟踪的文件添加到本地.gitignore,然后执行git update-index --assume-unchanged .gitignore,这样您对.gitignore 的更改就不会被推送。现在您将忽略(可能)未跟踪的文件,并且不会影响远程 .gitignore 文件。

            【讨论】:

            • 这正是我所处的情况,也是我的完美解决方案。谢谢!
            【解决方案8】:

            另一种方式:

            • 编辑本地.gitignore
            • 然后git update-index --assume-unchanged .gitignore

            【讨论】:

              猜你喜欢
              • 2014-11-12
              • 2021-02-20
              • 2012-03-15
              • 1970-01-01
              • 1970-01-01
              • 2014-10-24
              • 1970-01-01
              • 2021-01-13
              • 2023-03-14
              相关资源
              最近更新 更多