git 很慢,有很多被忽略的文件

ope*_*ngo 5 git gitignore tortoisegit

我已经建立了一个存储库来包含一个工作目录,该目录有数万个文件、数千个目录和许多 Gb 数据。此目录位于 samba 共享上。我只想在版本控制下在这个目录中有几十个源文件。

我已经这样设置了 gitignore 文件并且它可以工作:

# Ignore everything
*

# Except a couple of files in any directory
!*.pin
!*.bsh
!*/
Run Code Online (Sandbox Code Playgroud)

对存储库的操作(例如提交)需要几分钟才能执行。这太长了,无法合理地完成任何工作。我怀疑速度变慢是因为 git 正在遍历每个目录以查找可能已更新的文件。

在工作目录中只有几个位置我有要跟踪的文件,因此我尝试缩小要使用此查询检查的文件集的范围:

*
!/version_2/analysis/abcd.pin
!/version_2/analysis/*.bsh
!*/
Run Code Online (Sandbox Code Playgroud)

这也有效,但它仍然和不那么合格的 gitignore 一样慢。我猜是最后一行是杀手,但无论我如何尝试使 unignore 模式非常具体,我总是必须包含最后的通配符子句,以便进程找到要提交的任何文件。

所以我的两部分问题是

1) 是否有更好的方法来设置 gitignore 文件,通过仅包含包含相关结果的非常窄的一组目录和文件类型来帮助加快提交过程?

2) 是否需要对 git 或 samba 进行一些其他调整才能使这项工作更有效?

谢谢,

汤姆

ope*_*ngo 6

在摆弄了一下之后,我找到了一种通过修改 .gitignore 文件来显着提高性能的方法。

性能问题是由我忽略所有然后指定要取消忽略的方法引起的。这有一个很好的简明规范(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
Run Code Online (Sandbox Code Playgroud)

提交时间现在减少到几秒钟。

总的来说,这仍然很简单,虽然不像我最初的 4-liner 那样干净。

经过回顾,我认为我的问题是我成为了自己过早优化的受害者。


Seb*_*icz 0

不幸的是,对此您无能为力 - 至少在不重组您的存储库的情况下是这样。您的假设是正确的 - 因为您有一个非常大的工作树,其中包含许多单独的文件,git正在对它们进行全部搜索。不,调整你的.gitignore不会有帮助 - 据我所知,在内部,git仍然遵循每个文件夹路径,并且只忽略与.gitignore.

而且,很自然地,由于这是在网络共享上,这使得情况变得更糟,这意味着每次来回文件系统(其中许多是为任何“标准”git操作而进行的)都是在网络延迟的速度(即使每个文件只有几毫秒,加起来也会超过数千个文件)。

不幸的是,我不认为文件大小是这里的问题,因此评论(符号链接)中给出的建议可能不会给您带来任何加速,因为您的减速因素似乎是文件数量。

您可以做的是将所有未跟踪的文件移到存储库之外 - 如果它们占文件数量的大部分,它应该会为您提供显着的加速。这可能不一定是可能的,但这是我唯一能想到的除了将存储库移动到本地计算机之外的事情(这也不一定是可能的)。