我已经建立了一个存储库来包含一个工作目录,该目录包含数以万计的文件、数千个目录和数 Gb 的数据。此目录位于 samba 共享上。我只想在版本控制下的这个目录中有几十个源文件。
我已经这样设置了 gitignore 文件并且它有效:
# Ignore everything
*
# Except a couple of files in any directory
!*.pin
!*.bsh
!*/
对存储库的操作(例如提交)需要几分钟才能完成。这太长了,无法合理地完成任何工作。我怀疑速度变慢是因为 git 正在遍历每个目录以查找可能已更新的文件。
在工作目录中只有几个位置有我想要跟踪的文件,因此我尝试使用此查询缩小要检查的文件集的范围:
*
!/version_2/analysis/abcd.pin
!/version_2/analysis/*.bsh
!*/
这也有效,但它仍然和不太合格的 gitignore 一样慢。我猜最后一行才是关键,但无论我如何尝试使 unignore 模式非常具体,我总是必须包含最后的通配符子句,以便进程找到要提交的任何文件。
所以我的两部分问题是
1) 是否有更好的方法来设置 gitignore 文件,通过仅包括包含相关结果的非常狭窄的目录和文件类型集来帮助加快提交过程?
2) 是否需要对 git 或 samba 进行一些其他调整以提高这项工作的效率?
谢谢,
汤姆
最佳答案
经过一番摸索,我找到了一种只需修改 .gitignore 文件即可显着提高性能的方法。
性能问题是由我忽略所有然后指定要忽略的方法引起的。这有一个很好的简洁规范(4 行),但速度真的很慢。它导致 git 遍历整个目录树以检测更改的内容。
我的新改进方法是仅使用排除模式。使用它我可以指示要修剪的大 Twig 。我不得不添加一组更冗长的文档和文件类型来排除,这需要几次迭代才能正确,因为有太多了。由于数据集的性质,可能需要更多维护 .gitignore
如果出现新的文件类型,将来需要文件,但这是一个很小的代价。
这是我最后的 .gitignore
文件看起来像:
# prune large input data and results folders where ever they occur
../data/
../results/
# Exclude document types that don't need versioning,
# leaving only the types of interest
*~
*#
*.csv
*.doc
*.docx
*.gif
*.htm
*.html
*.ini
*.jpg
*.odt
*.pdf
*.png
*.ppt
*.pptx
*.xls
*.xlsx
*.xlsm
*.xml
*.rar
*.zip
提交时间现在缩短到几秒钟。
总的来说,这仍然很简单,尽管不如我最初的 4 行那么干净。
经过审查,我认为我的问题是我成为了自己过早优化的牺牲品。
关于git 非常慢,有很多被忽略的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642527/