查找所有不包含 .gitignore 和 .gitattributes 之一的 git 存储库

查找所有不包含 .gitignore 和 .gitattributes 之一的 git 存储库

我基本上想找到所有根目录下既没有 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\repo3myrepo10

我尝试使用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)

相关内容