我基本上想找到所有根目录下既没有 a.gitattributes
也没有文件的 git 存储库。.gitignore
我曾经find . -type d '!' -exec test -e "{}/.gitignore" ';' -print
找到过它,但它列出了所有目录,而不仅仅是顶级 git 目录。
我的目录树如下所示:
GitHub
├─ _Clones
| ├─ repo1 (has .gitignore)
| └─ repo2
├─ _Forks
| ├─ repo1 (has .gitattributes)
| └─ _For-Later
| ├─ repo2
| └─ repo3
├─ myrepo1 (has both)
├─ myrepo2 (has both)
...
└─ myrepo10
在这样的布局中,我希望输出为_Clones\repo2
、和。_Forks\_For-Later\repo2
_Forks\_For-Later\repo3
myrepo10
我尝试使用depth
参数进行查找,但这是每个目录的变量!
答案1
要列出 git 存储库的根目录,我使用以下命令:
find . -name .git -print0 | xargs -0 dirname
变体查找包含以下内容的所有文件夹.gitignore
:
find . -name .gitignore -print0 | xargs -0 dirname
确定根目录不包含的 git 存储库.gitignore
只需对两组文件夹进行设置操作即可:
comm -23 <(find . -name .git -print0 | xargs -0 dirname | sort) <(find . -name .gitignore -print0 | xargs -0 dirname | sort)
这会比较两组文件夹(必须排序)并列出仅出现在第一组中的文件夹。操作<()
是流程替代并允许任何命令的输出用作另一个命令而不是文件的输入。
替换.gitignore
为上面的内容以查找根目录中.gitattributes
不包含的 git 存储库....gitattributes
要获得您想要的最终输出,请将两者结合起来:
comm -23 <(comm -23 <(find . -name .git -print0 | xargs -0 dirname | sort) <(find . -name .gitignore -print0 | xargs -0 dirname | sort)) <(find . -name .gitattributes -print0 | xargs -0 dirname | sort)