【问题标题】:using gitignore to ignore (but not delete) files使用 gitignore 忽略(但不删除)文件
【发布时间】:2011-09-13 02:46:10
【问题描述】:

我的 git repo 中有一个 tmp 目录,我希望它仍然存在,但被忽略。我将它添加到.gitignore,但git status 仍然告诉我该目录中文件的更改。我试过git rm -r --cached,但这会将它从远程仓库中删除。如何停止跟踪对此目录的更改,但仍允许它存在?我还需要为 1 个文件执行此操作,但在 .gitignoreing 之后,对它们的更改也会显示在 git status 中。我该怎么办?

【问题讨论】:

  • 请写下你的 .gitignore 文件到底长什么样子?

标签: git version-control


【解决方案1】:

您可以通过运行以下命令来更新本地 git 存储库,而不是 .gitignore

git update-index --assume-unchanged <file>

在这种情况下,原始存储库中正在跟踪文件。您可以在本地仓库中修改它,git 永远不会将其标记为已更改。阅读更多:

【讨论】:

  • 我对 git 的喜爱可能翻了一番。
  • 这应该是公认的答案。感谢您提供链接。
  • 有没有办法将它推送到远程仓库?
  • hmm 我宁愿将文件标记为“它不是 git 文件,永远不要与 git 同步,即使在其他人的仓库中也是如此”
  • 您可以使用git update-index --no-assume-unchanged &lt;file&gt; 恢复它。如果你想列出他们git ls-files -v | grep '^h'.
【解决方案2】:

在允许文件存在的同时忽略对文件所做的更改是.gitignore 的确切目的。因此,将文件(或目录)添加到 .gitignore 是您唯一需要做的事情。

但您的问题是 git 已经在跟踪您要忽略的文件,而 .gitignore 不适用于跟踪的文件。停止这种跟踪的唯一方法是告诉 git 删除它们。通过使用git rm --cached,您可以防止 git 删除您的本地文件,但任何其他获取您更改的存储库都将应用删除。我认为没有办法从您自己的存储库中避免这种情况。您必须在其他存储库上执行某些操作,否则接受文件将被删除。

为了防止删除其他存储库,您可以:

  • (显然)将文件备份到某处,拉取更改并恢复文件,
  • git rm --cached 文件并提交拉取您的更改。 Git 会很好地合并这两个删除,而不会触及已经未跟踪的文件。

【讨论】:

  • 这不一定是真的(“停止跟踪 = 删除文件”)。您仍然可以在 repo 中跟踪文件并且看不到所做的任何更改,使用:git update-index --assume-unchanged &lt;file&gt;。看看:blog.pagebakers.nl/2009/01/29/…
  • 这解决了我的问题,因为我需要从 git 中的推送存储库中删除文件,所以 git rm --cached &lt;filename&gt; -r 并且在此推送之后再次更改到存储库以便删除文件
【解决方案3】:

.gitignore 文件中的目录名称末尾添加一个/,即

tmp/

如果在该目录中跟踪了文件,则需要先告诉 git 忘记它们(在将目录添加到忽略列表之前)。假设你在那里没有任何重要的东西(即你可以刮擦它):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

不会跟踪该目录中的新文件。

git rm--cached 选项仅适用于索引(或多或少有待更改)。它对工作树或已跟踪内容的状态没有影响。

【讨论】:

  • 我有。 the/dir/the/dir/*
  • 嘿,垫子,如果我想忽略不同文件夹中的 /Media 之类的东西,这可能吗?所以像/1/Media、/2/Media,一直到像99?
【解决方案4】:

.gitignore 对跟踪的文件没有影响。

您想要的是在 tmp/ 目录中的文件上设置假设不变位。这里有一个很好的解释:Git: untrack a file in local repo only and keep it in the remote repo

此外,用于在目录中的所有文件上设置假设不变的单行 - git update-index --assume-unchanged on directory

【讨论】:

    【解决方案5】:

    听起来您正在尝试跟踪文件(例如index.php),将其添加到远程存储库,然后停止观看跟踪它,同时将文件保留在远程(即保持index.php 在远程不变repo 同时在本地更改它)。

    据我了解,git 无法做到这一点。您可以跟踪文件,也可以不跟踪。如果您跟踪一个文件,它存在于远程仓库中,并在您提交更改时更改。如果您不跟踪文件,则远程存储库中不存在该文件。

    由于无法使用 git 完全按照您的意愿行事,因此可能还有其他解决方案,具体取决于您的具体情况。例如,当您在本地更改 index.php 时,为什么不希望远程更改它?文件中是否有用户特定的设置?如果是这种情况,您可以这样做:

    cp index.php index_template.php
    git rm --cached index.php
    

    现在将 index_template.php 编辑为您希望它出现在远程仓库中的样子。在您的 README 中添加一些内容,告诉使用您的存储库的人,一旦他们克隆它,他们必须将 index_template.php 复制到 index.php 并对其进行编辑以满足他们的需要。

    git add index_template.php
    git add README
    git commit -m 'added template index.php file'
    git push
    

    当有人克隆你的仓库时,他们必须创建自己的index.php。您让他们轻松搞定:只需将 index_template.php 复制到 index.php 并使用特定于计算机的设置进行修改。

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2014-07-06
      • 1970-01-01
      • 2022-11-16
      • 2019-04-29
      • 2018-05-02
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多