【问题标题】:.gitignore not being recursively applied.gitignore 没有被递归应用
【发布时间】:2018-02-04 22:51:23
【问题描述】:

最终目标: 让 git 递归地忽略 *.abc 类型的文件

问题: 吉特

说明:

我的gitignore 顶级文件位于/home/alma/project-origin/.gitignore 中有以下行。

/**/*.abc

我发出以下命令并得到以下输出

cd /home/alma/project-origin/top-secret/subject
touch alma-wade.abc
git status .
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        alma-wade.abc

nothing added to commit but untracked files present (use "git add" to track)

为了解决问题,我在该文件夹中创建了一个.gitignore 文件并再次运行它

cd /home/alma/project-origin/top-secret/subject
touch alma-wade.abc
echo "*.abc" >> .gitignore
git status .
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        modified: .gitignore

nothing added to commit but untracked files present (use "git add" to track)

我删除了 .gitignore 本地文件 (rm /home/alma/project-origin/top-secret/subject/.gitignore) 并开始排除故障

(A) 从缓存中删除

Source

cd /home/alma/project-origin/top-secret/subject
git rm -r --cached .
git commit -m "..."
git push origin master
#Successful push
git add .
git status .
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        alma-wade.abc

nothing added to commit but untracked files present (use "git add" to track)

(B) 检查文件编码

Source

file -bi /home/alma/project-origin/.gitignore
text/plain; charset=us-ascii

(C) 检查尾随空格

在vim中打开/home/alma/project-origin/.gitignore并发出命令:set list并进行目视检查

(D) 使用 git check-ignore -v

git check-ignore -v --no-index /home/alma/project-origin/top-secret/subject/alma-wade.abc
#no output
echo "*.abc" >> .gitignore
git check-ignore -v --no-index /home/alma/project-origin/top-secret/subject/alma-wade.abc
/home/alma/project-origin/top-secret/subject/.gitignore:1:*.abc       /home/alma/project-origin/top-secret/subject/alma-wade.abc
rm .gitignore

(E) 从顶级目录使用 git check-ignore -v

这是我最接近解决此问题的方法

cd /home/alma/project-origin/
echo "/**/*.abc" >> .gitignore
cd /home/alma/project-origin/top-secret/subject/
git check-ignore -v --no-index /home/alma/project-origin/top-secret/subject/alma-wade.abc
#No output
cd /home/alma/project-origin/
git check-ignore -v --no-index /home/alma/project-origin/top-secret/subject/alma-wade.abc
/home/alma/project-origin.gitignore:1:/**/*.abc       /home/alma/project-origin/top-secret/subject/alma-wade.abc

当我从顶级文件夹进行检查时应用顶级.gitignore 规则,但当我在子文件夹中时不应用。我已经黔驴技穷了。我唯一能想到的是,这与文件系统(已安装 cifs)有关。有人可以帮忙吗。

【问题讨论】:

  • 您有嵌套的存储库吗?即,top-secret/top-secret/subject/ 中是否还有另一个 .git/ 目录?
  • @Chris yes in top-secret 有一个(我不记得是故意制造的)
  • @Chris 这是否像删除git 文件夹之一一样简单?

标签: git gitignore


【解决方案1】:

如果您想忽略每次出现以 .abc 结尾的文件,那么您只需要:*.abc - ** 对于匹配中包含子目录名称的匹配最有用。

有关 ** 语法(和其他 glob)的一些示例,请参阅 https://www.atlassian.com/git/tutorials/gitignore

例如:

$ git init test
$ cd test
$ mkdir -p 1/2
$ touch foo.txt 1/bar.txt 1/2/baz.txt
$ git status
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)

1/
foo.txt

$ echo "*.txt" >.gitignore
$ git status
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)

.gitignore

【讨论】:

  • 你是说*.abc 等于/**/*.abc?我的理解是前者不是递归的
  • 是的 - 在答案中添加了一个示例。
【解决方案2】:

如果您有嵌套的 Git 存储库,“外部”存储库中的 .gitignore 不会影响“内部”存储库:

mkdir outer && cd outer
git init
echo '/**/*.txt/' > .gitignore
touch foo.txt
git status
# Untracked file '.gitignore'
# No mention of 'foo.txt'

mkdir inner && cd inner
git init
touch foo.txt
git status
# Untracked file 'foo.txt'

由于您有一个似乎不是故意创建的内部存储库,我建议删除其.git/ 目录(在进行任何您认为合适的备份之后)。这将使该目录的内容受制于外部存储库,.gitignore 现在应该生效。

您可能希望将内部目录中的文件提交到外部存储库。

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多