将所有子目录添加到Git

110

我在将一个文件夹及其所有子目录添加到我的git仓库时遇到了问题。在搜索了一些谷歌后,我意识到这是一个非常流行的问题,并尝试了每个建议,但都没有成功,特别是来自git-add手册页面的建议。我甚至尝试了git add -A,但也没有成功。为了简单起见,假设我将git仓库初始化为Dir1。然后我有以下文件目录结构。

Dir1/file1-1.txt
Dir1/file1-2.txt
Dir1/Dir2/file2-1.txt
Dir1/Dir2/Dir3/file3-1.txt

我的真实文件有子目录,深度达到5-6级,那么是否有一个git命令将每个子目录中的所有文件添加到我的存储库中?现在,当我执行man页面中的建议git add Dir1/\*时,我可以在我的存储库中看到Dir2,但它显示为绿色文件夹,我无法打开它,这使我相信Dir2中的所有文件/文件夹都没有被添加。任何帮助将不胜感激。我是新的git用户(使用不到一周),所以请尽量保持指导处于初学者水平。


4
git add 命令会自动递归添加目录中的所有内容。在仓库的顶层目录中使用 git add . 可以添加所有内容。如果未能添加,则可能是因为 .gitignore 文件被应用(本地或全局)。 - Nevik Rehnel
你检查了.gitignore文件吗?也许你的目录被忽略了。 - ogzd
2
git status --ignored 的输出是什么? - Chronial
2
只是为了帮助其他看到这个问题的人,如果你创建的目录里没有任何文件,它们不会被 git add . 添加。你必须添加一些文件到这些目录中,让 git 跟踪它们。 - gonephishing
9个回答

130

做,

git add .

如果在代码库的根目录下执行 git add . 命令,它将添加所有文件。如果你使用 git add * 命令,它只会添加 * 所指向的文件。而单个点则代表目录。

如果上述命令后你的目录或文件未被添加到Git索引/仓库,请检查是否在.gitignore 文件中被标记为忽略的文件。


9
刚试了一下,还是不行。我做了以下操作:git add . git commit git push origin master我有什么遗漏吗? - Josh Bradley
5
假设您的文件在 Dir1 中,您应该执行 cd Dir1; git init; git add . ; git commit;。不需要其他操作。如果您的 .gitignore 忽略了某个目录中的文件,但仍然想将它们添加到 Git 中,则需要使用 git add -f . 而不是 git add . - Kalle Pokki
6
我尝试了 "git add ." 但它没起作用。第二天,我又回来尝试,结果一切都“顺利”了,谢谢!可能是那种午夜时分的 bug,在灯光再次亮起时就消失了。 - Josh Bradley
3
git add . 不起作用,它不会递归添加子目录和子目录中的内容。 - Knows Not Much
"git add -f ." 在这里非常好用。感谢 @KallePokki。 - T.S
显示剩余2条评论

31

简单解决方案:

git rm --cached directory
git add directory

23

如果子目录本身是一个git仓库 - 即有一个.git目录,您也可能面临一些问题 - 可以使用ls -a进行检查。

要删除,请进入子目录并运行rm .git -rf


当子目录包含 .git 时会出现奇怪的问题,是的 :) 对于每个名为 ".git" 的目录,执行以下命令:for dir in find . -name ".git"; do rm -rf $dir; done - Serve Laurijssen

7

我也曾经苦恼过,但最终成功了。正确的输入方式是:

git add -f ./JS/*

其中,JS是我的文件夹名称,它包含子文件夹和文件。


2
它可以添加被忽略的文件并在代码库中造成混乱。 - changtung
2
“git add ./JS” 是正确的用法。它将添加目录中的所有文件和所有子目录,同时仍关注被忽略的文件。 - Rémi Benoit

1

我不能确定这是否是问题的原因,但对我而言,似乎问题出在某些子目录中有.gitignore文件。虽然我不能保证,但在删除这些文件后一切正常。


1
  1. 使用git add命令添加最深层次的文件(即要添加的Folder的最新级别)。例如:git add Folder/Subfolder-L1/Subfolder-L2/Subfolder-L3/...file123.md
  2. 然后,运行git add --all :/命令。它将会把所有的FoldersSubfoldersfiles添加到现有的仓库中。
  3. 运行git commit -m 'your commit'命令。
  4. 最后,运行git push -u origin main命令,将代码推送到远程仓库。完成!

参考资料:递归地将整个文件夹添加到存储库中


0
如果对于某些人而言,git add . 无法正常工作(就像我的情况一样),可以使用 git add ./*,它会包含所有子目录中的所有文件。我的目录结构如下:
MainDirectory
|_.git
|_README
|_folder1
|   |_file1
|   |_file2
|   |_subfolder1
|   |    |_file3
|   |    |_file4
|   |_subfolder2
|        |_file5
|        |_file6
|_folder2 
|   |_file1
|   |_file2
|   |_subfolder1
|   |    |_file3
|   |    |_file4
|   |_subfolder2
|        |_file5
|        |_file6
|_otherfiles

执行 git add ./* 会将一级或更深层次的所有内容都包含在内,而 git add . 只会添加当前层级的文件。


0

我之前遇到过这个问题,当我尝试添加的(子)文件夹名称以“_Something_”开头时。

我去掉了下划线,然后它就可以工作了。检查一下你的文件夹是否有可能导致问题的字符。


0
最有可能涉及到.gitignore文件。请注意,.gitignore文件不仅可以出现在库的根级别,还可以出现在任何子级别。您可以尝试从根级别开始查找它们:
find . -name ".gitignore"
然后检查结果,看看是哪些文件阻止了您的子目录被添加。
还可能涉及到子模块。请检查有问题的目录以获取“.gitmodules”文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接