Git添加。在具有.git文件夹的子目录上失败,即使被忽略

时间:2017-03-07 15:16:54

标签: git gitignore conda miniconda

我们有一个深层目录结构,包含不同级别的多个README文件。例如:

gitignoretest/
|-- 00README
|-- dir1
|   |-- 00README
|   |-- dir1
|   |   |-- 00README
|   |   |-- dir1
|   |   |-- dir2
|   |   |-- dir3
|   |   |-- file1
|   |   `-- file2
|   |-- dir2
|   |   |-- 00README
|   |   |-- dir1
|   |   |-- dir2
|   |   |-- dir3
|   |   |-- file1
|   |   `-- file2
|   |-- dir3
|   |   |-- 00README
|   |   |-- dir1
|   |   |-- dir2
|   |   |-- dir3
|   |   |-- file1
|   |   `-- file2
|   |-- file1
|   `-- file2
|-- dir3
|   |-- 00README
|   |-- dir1
|   |   |-- 00README
|   |   |-- dir1
|   |   |   |-- 00README
|   |   |   |-- dir1
|   |   |   |-- dir2
|   |   |   |-- dir3
|   |   |   |-- file1
|   |   |   `-- file2
|   |   |-- dir2
|   |   |   |-- 00README
|   |   |   |-- dir1
|   |   |   |-- dir2
|   |   |   |-- dir3
|   |   |   |-- file1
|   |   |   `-- file2

...
...

我们只希望版本00README个文件。我们使用this .gitignore

成功对此进行了测试

的.gitignore

# Ignore everything
*

# But not these files...
!.gitignore
!00README
# etc...

# ...even if they are in subdirectories
!*/

但是,在真实方案中,其中一个子目录是conda安装,其中包含一些包含其自己的.git目录的包。当我执行git add .时,它失败并显示以下消息:

fatal: Not a git repository: Applications/conda/lib/STAR-Fusion/STAR-Fusion.wiki/../.git/modules/STAR-Fusion.wiki

真实情况为../TopLevel/Applications/... ../TopLevel/.gitignore。以下是我尝试过的事情:

../顶层/的.gitignore

# Ignore everything
*
/Applications/conda/**/*
/Applications/miniconda3/**/*
/Applications/newconda/**/*

Applications/conda/**/*
Applications/miniconda3/**/*
Applications/newconda/**/*

/**/.git
**/.git

/**/.git/**
**/.git/**

# But not these files...
!.gitignore
!00README.md
!USE_APPS
# etc...

# ...even if they are in subdirectories
!*/

但没有达到标记。

修改
解决"未跟踪问题" @VonC提到.git个文件夹的子目录,我提供了一个全新的git存储库创建。注意:作为远程添加的存储库是刚刚创建的--bare存储库。

balter@server:/home/.../TopLevel$ rmdir .git
balter@server:/home/.../TopLevel$ git init
Initialized empty Git repository in /home/.../TopLevel/.git/
balter@server:/home/.../TopLevel$ git remote add origin git@server.ohsu.edu:path/repo.git
balter@server:/home/.../TopLevel$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   .gitignore
#   00README.md
#   Applications/
#   InstallationPackages/
#   USE_APPS
#   gitignoretest/
nothing added to commit but untracked files present (use "git add" to track)
balter@server:/home/.../TopLevel$ git add .
fatal: Not a git repository: Applications/conda/lib/STAR-Fusion/STAR-Fusion.wiki/../.git/modules/STAR-Fusion.wiki

1 个答案:

答案 0 :(得分:1)

如果要将所有树结构视为一个存储库,则需要先删除嵌套的.git子文件夹:请参阅“Initial push to GitHub Missing Sub Directory”。

关于忽略规则,如果你想忽略除OOREMEADE文件之外的所有内容,你需要fisrt来排除文件夹

*
!**/

然后您可以排除文件:

!00README

确保首先将这些文件取消跟踪(git status

  

我们的Applications目录有一个conda安装,似乎通过克隆git存储库来安装许多软件包。如果我去删除所有的.git目录,那么每当我运行conda update时,它都会失败,因为它不再有它需要的repos,或者它会重新克隆它们。

首先,您不要忽略.git个文件夹:它们的父文件夹代表一个嵌套的git仓库。这是您要忽略的文件夹(.git文件夹的父级),git add .不会记录 gitlink ({{3 }})

其次,“Not a git repository: .../../.git/modules/...”表示conda嵌套的repo具有 special entry in index of the parent repo ,其submodules:该conda安装文件夹需要git submodule update --init --recursive为了初始化正确的嵌套子模块。