Git忽略被跟踪的文件而不删除它们

mow*_*ker 17 git version-control

我在理解基本的git概念时遇到了一些麻烦:/

在我的git控制的网站上尝试一些东西之前,我正在我的本地Windows机器上进行测试.

我有:

gittesting/repo1:
    file.txt
    ignoreme:
        ignore.txt
Run Code Online (Sandbox Code Playgroud)

gittesting/repo2
    file.txt
    ignoreme:
        ignore.txt
Run Code Online (Sandbox Code Playgroud)

Repo2是repo1的副本,并且已经跟踪了ignoreme.ignore.txt文件在repo2中被更改,但我想停止跟踪它并让git完全忽略它.问题是,如果我创建一个.gitignore文件并添加ignoreme,它已经太晚了,因为它已经被跟踪了,所以我不得不做git rm --cached ignore,但是它被标记为已删除,如果我将提交删除repo1,该目录将被删除而不是被单独留下..

把它们加起来:

  1. ignore.txt在两个repos之间有不同的内容.
  2. 我希望ignore.txt内容保持原样并被git完全忽略

我在网上看过,在IRC问过,并查看了相关的问题,但找不到办法做到这一点.我知道这个例子似乎微不足道,但这正是我需要在我的网站上做的事情,目录是论坛/缓存.


编辑:

这有点像黑客,我更喜欢更好的答案,但我最终做了:

cd repo2
echo "ignoreme" > .gitignore
echo "ignoreme/*" > .gitignore
git rm --cache -r ignoreme
git commit -m "Should ignore now"
cd ../repo1
mv ignoreme ignoreme2
git pull ../repo2
mv ignoreme2 ignoreme
Run Code Online (Sandbox Code Playgroud)

Mic*_*ior 19

试试这个

git update-index --assume-unchanged ignoreme/ignore.txt
Run Code Online (Sandbox Code Playgroud)

如果不更改存储库,Git将忽略此文件的任何未来更改.要再次开始跟踪更改,请使用

git update-index --no-assume-unchanged ignoreme/ignore.txt
Run Code Online (Sandbox Code Playgroud)

请注意,这仅对当前工作副本生效,因此每次克隆存储库时都需要执行此操作.

  • 如果您实际上没有更改文件,则使用`--assume-unchanged`是合法的.如果你改变它,你就是在撒谎,而且永远不会结束. (2认同)
  • @SethRobertson如果你实际上没有改变文件,就不需要`--assume-unchanged`.例如,您可能需要临时修改不应提交到存储库的配置设置.我同意这也很危险,因为很容易忘记发生这种情况并避免做出重大改变. (2认同)

Ada*_*arp 7

如果我正确理解您的问题,您想repo2了解该ignoreme/目录,但您不希望Git关心对该目录的任何修改.并且git rm --cached对你没有帮助,因为你告诉Git 从现在开始停止跟踪这些内容.

Git用于跟踪内容但通过子模块修复的解决方案.除了Git Book之外,这个解释了(重点补充):

尽管rack是工作目录中的子目录,但Git将其视为子模块,并且当您不在该目录中时不会跟踪其内容.相反,Git将其记录为来自该存储库的特定提交.

您可以尝试以下方法:

  1. ignoreme/目录复制到新位置,并使其成为git存储库

  2. 将其作为子模块添加回repo2:

    git submodule add file:///path/to/ignoreme ignoreme
    git commit -m"Add ignoreme/ as a submodule"
    
    Run Code Online (Sandbox Code Playgroud)

ignoreme现在子模块固定在特定的提交.repo2仍在跟踪子模块内的任何内容,但除非您在子模块中提交ignoreme/,repo2否则不会跟踪对文件的任何更改.让我们说ignoreme/ignore.txt以某种方式修改:

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#       modified:   ignoreme (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)

即使您运行git add .,更改ignoreme/ignore.txt也不会添加到索引中,除非它们像这样提交到子模块:

$ cd ignoreme
$ git commit -am"Time to change ignore.txt"
$ cd ..
$ git add .
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   ignoreme
#
Run Code Online (Sandbox Code Playgroud)

但是,如果您想忘记子模块中的本地修改:

$ cd ignoreme
$ git reset --hard
$ cd ..
Run Code Online (Sandbox Code Playgroud)