我已经设置了一个存储库,其中包含一个工作目录,该目录包含数万个文件,数千个目录,以及许多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进行一些其他调整才能提高效率?
谢谢,
汤姆
答案 0 :(得分:3)
在摆弄了一下之后,我找到了一种通过修改.gitignore文件来显着提高性能的方法。
性能问题是由我忽略所有然后指定unignore的方法引起的。这有一个很简洁的规范(4行),但真的很慢。它导致git遍历整个目录树以检测更改的内容。
我的新改进方法是使用排除模式。使用这个我可以指示修剪树的大分支。我不得不添加一组更长的文档和文件类型来排除,这需要几次迭代才能正确,因为有这么多。由于数据集的性质,如果出现新的文件类型,将来可能需要更多维护.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轮胎那么干净。
经过审核,我认为我的问题是我成了自己过早优化的受害者。
答案 1 :(得分:0)
不幸的是,你不能做很多事情 - 至少,不是没有重组你的回购。您的假设是正确的 - 因为您有一个包含大量单个文件的非常大的工作树,git
正在遍历它们。不,调整你的.gitignore
无济于事 - 据我所知,git
仍然跟随每个文件夹路径,并且只忽略与{中指定的模式匹配的文件(不是文件夹) {1}}。
而且,很自然地,由于这是在网络共享上的事实,这意味着每次来回到文件系统(其中许多是针对任何“标准”{{ 1}}操作)以网络延迟的速度完成(即使每个文件几毫秒加上数千个文件)。
不幸的是,我不相信文件大小是问题所在,所以评论中给出的建议(符号链接)可能不会给你任何加速,因为你的减速因子似乎是文件的数量
你可以做的是将所有未跟踪的文件移到回购之外 - 如果它们构成了大量的文件,它应该为你提供大量的加速。这可能不一定是可能的,但这是我能想到的唯一一件事就是将回购转移到本地机器上(这可能不一定是可能的)。