4

我们有一个深度目录结构,其中包含不同级别的多个 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文件进行版本控制。我们用这个成功地测试了这个 .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. 以下是我尝试过的事情:

../TopLevel/.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
4

1 回答 1

1

如果要将所有树结构视为一个存储库,则需要先删除嵌套的.git子文件夹:请参阅“初始推送到 GitHub 缺少子目录”。

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

*
!**/

然后你可以排除文件:

!00README

确保首先未跟踪这些文件 ( git status)

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

首先,您不要忽略.git文件夹:它们的父文件夹代表一个嵌套的 git 存储库。那是.git您要忽略的文件夹(文件夹的父级),这样git add .就不会记录gitlink父回购索引中的特殊条目

其次,“ Not a git repository: .../../.git/modules/...”表示 conda 嵌套 repo 具有子模块,其对 conda 的支持仍在进行中:conda 安装文件夹需要 agit submodule update --init --recursive才能初始化正确的嵌套子模块。

于 2017-03-07T18:28:27.813 回答