12 minutes
Git LFS experiments
I wanted to learn how does a Git repository with a significant amount of blob content (i.e., images) behave when it starts to adopt the use of Git LFS.
To start the experiment, I created a GitLab repository and started to populate it with some blob content from https://gegl.org/operations/images. I committed only a selection of those image files because my goal was to see how much the history of a file (changes, deletion) affects the total size instead of pushing the repo size to its limits.
The repo I created has the following history
cd27b73537a5d6dc6c550b91d0c647b379531559 Add 15 PNG images
09832f0c92ed29e1c1f450ef41ce0c6093577339 Update README
9e9d2ada58bdc808cfa52cf1f67f4de0cbced375 Add 22 PNG images
85902ccf6e73f3172b45a1f58193f6de5c0a8e92 Remove 8 PNG images
7e8d6e464bebe114239445c6f3b90bdcae1d37a0 Add 8 PNG images
b6c6107eac9ccb7de8926408f2d2fa7f41cb8468 Change 2 PNG images
dde8836c97388b255db25cebf4199ff714ca6fcc Add 3 PNG images
c54f9c38a9ce3cd161ce9c7cda5687a2c367726a Add 2 PNG images
27e2463fce42ccc82eb23a1a9320b01df640cb25 Initial commit
and the following file structure
; tree -a -L1
.
├── gegl-absolute.png
├── gegl-add.png
├── gegl-edge.png
├── gegl-emboss.png
├── gegl-mantiuk06.png
├── gegl-map-absolute.png
├── gegl-map-relative.png
├── gegl-matting-global.png
├── gegl-matting-levin.png
├── gegl-maze.png
├── gegl-mean-curvature-blur.png
├── gegl-median-blur.png
├── gegl-mirrors.png
├── gegl-mix.png
├── gegl-mono-mixer.png
├── gegl-mosaic.png
├── gegl-motion-blur-circular.png
├── gegl-motion-blur-linear.png
├── gegl-motion-blur-zoom.png
├── gegl-multiply.png
├── .git
├── .gitattributes
├── README.md
├── svg-clear.png
├── svg-color-burn.png
├── svg-color-dodge.png
├── svg-darken.png
├── svg-difference.png
├── svg-dst-atop.png
├── svg-dst-in.png
├── svg-dst-out.png
├── svg-dst-over.png
├── svg-dst.png
├── svg-exclusion.png
├── svg-hard-light.png
├── svg-lighten.png
├── svg-overlay.png
├── svg-plus.png
├── svg-screen.png
├── svg-src-atop.png
├── svg-src-in.png
├── svg-src-out.png
├── svg-src-over.png
├── svg-src.png
└── svg-xor.png
The total size of the repository (after cloning a freshly pushed revision), as reported by du -sh
, is 8.8M
.
Before we add LSF into the loop, let’s use git filter-repo --analyze
to get a better idea of how the blobs affect the repository.
; cat .git/filter-repo/analysis/path-all-sizes.txt
=== All paths by reverse accumulated size ===
Format: unpacked size, packed size, date deleted, path name
371240 371337 <present> gegl-absolute.png
310636 310718 <present> gegl-add.png
240147 240231 <present> gegl-edge.png
233061 233116 2025-09-09 gegl-whirl-pinch.png
230614 230566 2025-09-09 gegl-wavelet-blur.png
212271 212345 2025-09-09 gegl-wavelet-blur-1d.png
203201 203050 <present> gegl-mix.png
201299 201365 2025-09-09 gegl-wind.png
203853 184968 <present> gegl-emboss.png
179082 179129 <present> svg-color-burn.png
179047 179094 <present> svg-difference.png
178255 178302 <present> svg-exclusion.png
174454 174501 <present> svg-darken.png
172475 172522 2025-09-09 gegl-weighted-blend.png
162784 162826 <present> svg-dst-over.png
162190 162214 2025-09-09 gegl-watershed-transform.png
162171 162213 <present> svg-hard-light.png
161829 161871 <present> svg-dst.png
161563 161543 <present> svg-src-atop.png
159857 159899 <present> svg-xor.png
158151 158164 <present> svg-src-over.png
156130 156161 <present> svg-overlay.png
155179 155221 <present> svg-dst-out.png
153732 153774 <present> svg-screen.png
150686 150728 <present> svg-color-dodge.png
149290 149329 <present> svg-lighten.png
145362 145389 <present> svg-plus.png
61095 60624 <present> svg-dst-atop.png
60195 59732 <present> svg-dst-in.png
33754 31952 <present> svg-src-in.png
30100 28324 <present> svg-src.png
15005 14129 <present> svg-src-out.png
5527 5508 2025-09-09 gegl-waterpixels.png
6415 2820 <present> README.md
880 282 <present> svg-clear.png
880 282 2025-09-09 gegl-warp.png
; cat .git/filter-repo/analysis/blob-shas-and-paths.txt
=== Files by sha and associated pathnames in reverse size ===
Format: sha, unpacked size, packed size, filename(s) object stored as
4da24b7db8f75185b9d14fc75887f52e5c298322 240147 240231 gegl-edge.png
fc7402689622850cac1d40083772d3a67d9d1596 233061 233116 gegl-whirl-pinch.png
0bc700231efcdb5cdee87d370dbf0f4c8b07edb1 230614 230566 gegl-wavelet-blur.png
e4db420a41a4dcba3c4c3cfc6e0b5ca27d9eed03 212271 212345 gegl-wavelet-blur-1d.png
dec0da64679bdaeeebcbfc6682ca04df17359c2f 209411 209466 gegl-absolute.png
47124fec70468c56bfed2207099d18e92fc447a9 203201 203050 gegl-mix.png
7c5be0c409f7cfa02757b1b9a46bf68a16a1a00e 201299 201365 gegl-wind.png
a16b989ef596390e851978d3ced8d037ec4180e9 203853 184968 gegl-emboss.png
6bc7f8ea7cf6bc566a0096b2b05239f74b555896 179082 179129 svg-color-burn.png
5f75b8e1ea41a5c07dd26959a942ccfbf66b85a6 179047 179094 svg-difference.png
20b11e18549987d30616778bdfb6c485ce3ce374 178255 178302 svg-exclusion.png
8e75bb85c9dba476b509fe45a17288410b88a273 174454 174501 svg-darken.png
c978c57b887a9e454a269d049fef1bc168e2525f 172475 172522 gegl-weighted-blend.png
48f43567f4adf5d6c275307cab17584332e93520 162784 162826 svg-dst-over.png
3927cafccf2f8c36de510745bb2b56b66dc6f845 162190 162214 gegl-watershed-transform.png
c0461683630ba26c5cf01d9b2fb3433ffc173561 162171 162213 svg-hard-light.png
b71a36b5e9c0332263e05e5b6381bb60acbc14be 161829 161871 [gegl-absolute.png, svg-dst.png]
10039b888ce74ee8e51de9e8aa28b0f3686b71be 161563 161543 svg-src-atop.png
263656d8307f054500b7220ccf47d96491cb31db 161429 161469 gegl-add.png
64383a99e7b216cf11756b1bacf54b3831d99cf2 159857 159899 svg-xor.png
2dc040dfd7972f83a3cf86638e1b28fa7c995554 158151 158164 svg-src-over.png
34be8402b77d578a49fa2b1b536969e8c3efaf09 156130 156161 svg-overlay.png
1b1bad6a3f54fd6147a41345298ad367d46e22cf 155179 155221 svg-dst-out.png
04630ced51a85df0c6d0fee87371538af8231ada 153732 153774 svg-screen.png
b9047d59f5caf61625b5679032dbc13a38835bff 150686 150728 svg-color-dodge.png
c211cf0d2ad678b287b456a92f76ec8d2045cbd8 149290 149329 svg-lighten.png
673f17a9168c417e918016d41fb4ad98a33192cd 149207 149249 gegl-add.png
eff05256016dc4390c513c9c7100b4878bfd754e 145362 145389 svg-plus.png
dc58d8237c3ef5a01517967a1ecc7c483b459839 61095 60624 svg-dst-atop.png
04d6e9ec28111a12825a95d9a735d735637f3ddd 60195 59732 svg-dst-in.png
b17d7ce0da64a5c0d61592f9f3cc1b152086ea64 33754 31952 svg-src-in.png
ac0abd080f5701970bb2a7d85c0ac76b2a2a96af 30100 28324 svg-src.png
a0169d75273ac7753bb4e21dc7475795474a0be9 15005 14129 svg-src-out.png
88ac936e1d0583646f3a1786a6850f0536d2fd3f 5527 5508 gegl-waterpixels.png
c9bb54b53b825bdae31b68951f122247de6be4ef 6154 2645 README.md
fbc3fa34b08de66b07c95206b29562d825504dbc 880 282 [gegl-warp.png, svg-clear.png]
e68f00d6215c6b87a68bb3448ee1e9b30279ae9d 261 175 README.md
Most of the size comes from the sheer number of PNG files but some noteworthy parts are related to images that have been deleted (e.g., gegl-wind.png
) or have been updated (e.g., gegl-add.png
). So, this would only get worse with the history of the file getting longer.
Let’s add LSF into the mix. The first step is that the extension needs to be installed. On Fedora it is packed as git-lfs
. Then, LSF needs to be installed. What this means tells the documentation:
; git lfs install --help
git lfs install [options]
Perform the following actions to ensure that Git LFS is setup properly:
* Set up the clean and smudge filters under the name "lfs" in the global
Git config.
* Install a pre-push hook to run git lfs pre-push for the current
repository, if run from inside one. If "core.hooksPath" is configured in
any Git configuration (and supported, i.e., the installed Git version is
at least 2.9.0), then the pre-push hook will be installed to that
directory instead.
This installation can be done globally, locally (i.e., in a repository) or per-worktree.
An important setting is --skip-smudge
. Smudge refers to automatic download of objects from LSF on clone or pull. You want this setting to be set in your installation, if you do not want to pull objects automatically.
; cd
; git lfs install --skip-smudge
Git LFS initialized.
Now, let’s do the same but for the cloned repository and let’s set LFS to track .png
files.
; cd lfs-playground
; git lfs install --local --skip-smudge
Updated Git hooks.
Git LFS initialized.
; git lfs track "*.png"
Tracking "*.png"
; git add ./*.png .gitattributes
; cat .gitattributes
*.png filter=lfs diff=lfs merge=lfs -text
; git commit -m "Track PNG files using Git LFS"
[main 88a1c78] Track PNG files using Git LFS
28 files changed, 1 insertion(+)
create mode 100644 .gitattributes
; du -sh ./
13M ./
LFS uses the .gitattributes
file to know which file types (or files) it should track. Keep track of it.
So… what’s the benefit now? The repository has (locally) increased in size, the PNG images are still in the repository, they are still being pulled on each clone and now I need to have LSF installed to even pull the repository.
Let’s take a look at the output of git clone
.
; git clone git@ssh.gitlab.gnome.org:martymichal/lfs-playground.git lfs-playground-v2
Cloning into 'lfs-playground-v2'...
remote: Enumerating objects: 56, done.
remote: Counting objects: 100% (56/56), done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 56 (delta 7), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (56/56), 4.92 MiB | 3.17 MiB/s, done.
Resolving deltas: 100% (7/7), done.
Encountered 27 files that should have been pointers, but weren't:
gegl-absolute.png
gegl-add.png
gegl-edge.png
gegl-emboss.png
gegl-mix.png
svg-clear.png
svg-color-burn.png
svg-color-dodge.png
svg-darken.png
svg-difference.png
svg-dst-atop.png
svg-dst-in.png
svg-dst-out.png
svg-dst-over.png
svg-dst.png
svg-exclusion.png
svg-hard-light.png
svg-lighten.png
svg-overlay.png
svg-plus.png
svg-screen.png
svg-src-atop.png
svg-src-in.png
svg-src-out.png
svg-src-over.png
svg-src.png
svg-xor.png
Aha, LFS is enabled, tracks .png
files but we still have files that are not PNGs. That’s because we had those already committed by the time LFS was enabled. How can they be converted to LFS pointers?
The most straightforward tool for this is git lfs migrate
. It serves for migrating both to and from LFS. And it can do so either destructively by rewriting the repo history or non-destructively. Before trying to do the migration, we can see the state of the repository using git lfs migrate info
:
; git lfs migrate info --everything
migrate: Sorting commits: ..., done.
migrate: Examining commits: 100% (10/10), done.
*.png 5.3 MB 37/37 files 100%
*.md 6.4 KB 2/2 files 100%
*.gitattributes 42 B 1/1 file 100%
As expected, the most space is used by the PNG files. Let’s take a look at the non-destructive approach.
; git lfs migrate import --no-rewrite -m "Migrate PNG files to use LFS" *.png
migrate: override changes in your working copy? All uncommitted changes will be lost! [y/N] y
migrate: changes in your working copy will be overridden ...
migrate: checkout: ..., done.
; git log --format=oneline
c587f933bfef4d27b9b04e8479381a9ad45faa10 (HEAD -> main) Migrate PNG files to use LFS
abec235a53ce7b8d1da5162c24b43583125a14e5 (origin/main, origin/HEAD) Track PNG files using Git LFS
84313a0ac89f77b9bca03a40ef412869d220da80 Update README
40bae48e551cc51c6e2d881d60cfc3162575034a Remove 8 PNG images
fb314f480c9fe6f3600eea08016075dd262b003b Add 22 PNG images
90510bec4aae5c3a3f159909fa62397e2babf64c Add 8 PNG images
c38b179b609e16db6aee2ff170bc9efca02286ee Change 2 PNG images
1943349b140c040ea535bb1e7dcb8eb4c6a17936 Add 3 PNG images
6b9ef2eb36bdfa9073455c91631c4f2087b0dcab Add 2 PNG images
53f17dcb7e6f77ddbf77fd443e98d0175563b8f6 Initial commit
Checking the size of the repository again with du -sh
now reports 9.2M
. We’re getting somewhere. How does clone behave now?
; git clone git@ssh.gitlab.gnome.org:martymichal/lfs-playground.git lfs-playground-v3
Cloning into 'lfs-playground-v3'...
remote: Enumerating objects: 85, done.
remote: Counting objects: 100% (85/85), done.
remote: Compressing objects: 100% (83/83), done.
remote: Total 85 (delta 7), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (85/85), 4.92 MiB | 1.48 MiB/s, done.
Resolving deltas: 100% (7/7), done.
As expected, using a non-destructive import to LFS doesn’t solve the issue of the initial clone being too large. The blobs are still in the history of the repository. Let’s take a look at the destructive approach.
As the first step, let’s reset the last commit.
; git reset HEAD^ --hard
HEAD is now at abec235 Track PNG files using Git LFS
Encountered 27 files that should have been pointers, but weren't:
gegl-absolute.png
gegl-add.png
gegl-edge.png
gegl-emboss.png
gegl-mix.png
svg-clear.png
svg-color-burn.png
svg-color-dodge.png
svg-darken.png
svg-difference.png
svg-dst-atop.png
svg-dst-in.png
svg-dst-out.png
svg-dst-over.png
svg-dst.png
svg-exclusion.png
svg-hard-light.png
svg-lighten.png
svg-overlay.png
svg-plus.png
svg-screen.png
svg-src-atop.png
svg-src-in.png
svg-src-out.png
svg-src-over.png
svg-src.png
svg-xor.png
abec235a53ce7b8d1da5162c24b43583125a14e5 (HEAD -> main) Track PNG files using Git LFS
84313a0ac89f77b9bca03a40ef412869d220da80 Update README
40bae48e551cc51c6e2d881d60cfc3162575034a Remove 8 PNG images
fb314f480c9fe6f3600eea08016075dd262b003b Add 22 PNG images
90510bec4aae5c3a3f159909fa62397e2babf64c Add 8 PNG images
c38b179b609e16db6aee2ff170bc9efca02286ee Change 2 PNG images
1943349b140c040ea535bb1e7dcb8eb4c6a17936 Add 3 PNG images
6b9ef2eb36bdfa9073455c91631c4f2087b0dcab Add 2 PNG images
53f17dcb7e6f77ddbf77fd443e98d0175563b8f6 Initial commit
The PNG images are, again, not LFS pointers. Let’s try to migrate in a destructive manner.
; git lfs migrate import --everything --include="*.png"
migrate: override changes in your working copy? All uncommitted changes will be lost! [y/N] y
migrate: changes in your working copy will be overridden ...
migrate: Sorting commits: ..., done.
migrate: Rewriting commits: 100% (10/10), done.
main abec235a53ce7b8d1da5162c24b43583125a14e5 -> 5928889be5b6777a5f66b3dec5dd23374c382787
migrate: Updating refs: ..., done.
migrate: checkout: ..., done.
; git log --format=oneline
5928889be5b6777a5f66b3dec5dd23374c382787 (HEAD -> main) Track PNG files using Git LFS
a7e249520e18698946cb0687accad12af9e740bd Update README
5eb47b1d266486ac8cab7bad4bdec9368396a28b Remove 8 PNG images
89121457214af460d9ef8e31454e5faf627aa2e8 Add 22 PNG images
c63ab6508c065cec01ff7ad2c1635e5f6afb2f91 Add 8 PNG images
528a14fc76bdf3b28eb634a3d01e72c31f6d381b Change 2 PNG images
abda7f9936c3c6ac10c847dbf85bb2ccb9de6e57 Add 3 PNG images
852ce3a97450542f201ac7251a9fe7b30e4c5f86 Add 2 PNG images
50cde5b4791f3f2085944d40692e826c3fa01bbd Initial commit
So, the whole history of the project is rewritten… not great. Let’s see the result of the migration on the initial clone.
; git clone git@ssh.gitlab.gnome.org:martymichal/lfs-playground.git lfs-playground-v4
Cloning into 'lfs-playground-v4'...
remote: Enumerating objects: 55, done.
remote: Counting objects: 100% (55/55), done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 55 (delta 8), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (55/55), 9.71 KiB | 9.71 MiB/s, done.
Resolving deltas: 100% (8/8), done.
Much better! Since the repo is so small now, the pulled PNG images must be only pointers now.
; tree -h
[ 848] .
├── [ 131] gegl-absolute.png
├── [ 131] gegl-add.png
├── [ 131] gegl-edge.png
├── [ 131] gegl-emboss.png
├── [ 131] gegl-mix.png
├── [ 261] README.md
├── [ 128] svg-clear.png
├── [ 131] svg-color-burn.png
├── [ 131] svg-color-dodge.png
├── [ 131] svg-darken.png
├── [ 131] svg-difference.png
├── [ 130] svg-dst-atop.png
├── [ 130] svg-dst-in.png
├── [ 131] svg-dst-out.png
├── [ 131] svg-dst-over.png
├── [ 131] svg-dst.png
├── [ 131] svg-exclusion.png
├── [ 131] svg-hard-light.png
├── [ 131] svg-lighten.png
├── [ 131] svg-overlay.png
├── [ 131] svg-plus.png
├── [ 131] svg-screen.png
├── [ 131] svg-src-atop.png
├── [ 130] svg-src-in.png
├── [ 130] svg-src-out.png
├── [ 131] svg-src-over.png
├── [ 130] svg-src.png
└── [ 131] svg-xor.png
1 directory, 28 files
Exactly so. To get these actual files, one now needs to run git lfs pull
explicitly.
; git lfs pull
Downloading LFS objects: 100% (27/27), 3.8 MB | 961 KB/s
; tree -h
[ 848] .
├── [ 205K] gegl-absolute.png
├── [ 158K] gegl-add.png
├── [ 235K] gegl-edge.png
├── [ 199K] gegl-emboss.png
├── [ 198K] gegl-mix.png
├── [ 261] README.md
├── [ 880] svg-clear.png
├── [ 175K] svg-color-burn.png
├── [ 147K] svg-color-dodge.png
├── [ 170K] svg-darken.png
├── [ 175K] svg-difference.png
├── [ 60K] svg-dst-atop.png
├── [ 59K] svg-dst-in.png
├── [ 152K] svg-dst-out.png
├── [ 159K] svg-dst-over.png
├── [ 158K] svg-dst.png
├── [ 174K] svg-exclusion.png
├── [ 158K] svg-hard-light.png
├── [ 146K] svg-lighten.png
├── [ 152K] svg-overlay.png
├── [ 142K] svg-plus.png
├── [ 150K] svg-screen.png
├── [ 158K] svg-src-atop.png
├── [ 33K] svg-src-in.png
├── [ 15K] svg-src-out.png
├── [ 154K] svg-src-over.png
├── [ 29K] svg-src.png
└── [ 156K] svg-xor.png
1 directory, 28 files
And the repository size, as reported by du -sh
, is now 7.6M
. The difference between the original size and the current one must come from not having to keep track of the removed and updated images.
Running git filter-repo --analysis
on the new repo yields
; cat .git/filter-repo/analysis/path-all-sizes.txt
=== All paths by reverse accumulated size ===
Format: unpacked size, packed size, date deleted, path name
6415 2820 <present> README.md
262 240 <present> gegl-add.png
262 240 <present> gegl-absolute.png
131 122 <present> svg-difference.png
131 121 <present> svg-plus.png
131 121 <present> svg-hard-light.png
131 121 <present> svg-exclusion.png
131 121 2025-09-09 gegl-wind.png
131 121 <present> gegl-mix.png
131 121 <present> gegl-edge.png
131 120 <present> svg-xor.png
130 120 <present> svg-src-out.png
130 120 <present> svg-src-in.png
131 120 <present> svg-src-atop.png
131 120 <present> svg-screen.png
131 120 <present> svg-overlay.png
131 120 <present> svg-lighten.png
131 120 <present> svg-dst.png
131 120 <present> svg-dst-out.png
130 120 <present> svg-dst-in.png
131 120 <present> svg-darken.png
131 120 <present> svg-color-dodge.png
131 120 <present> svg-color-burn.png
131 120 2025-09-09 gegl-whirl-pinch.png
131 120 2025-09-09 gegl-weighted-blend.png
131 120 2025-09-09 gegl-wavelet-blur-1d.png
129 120 2025-09-09 gegl-waterpixels.png
131 120 <present> gegl-emboss.png
130 119 <present> svg-src.png
131 119 <present> svg-src-over.png
131 119 <present> svg-dst-over.png
130 119 <present> svg-dst-atop.png
128 119 <present> svg-clear.png
131 119 2025-09-09 gegl-wavelet-blur.png
131 119 2025-09-09 gegl-watershed-transform.png
128 119 2025-09-09 gegl-warp.png
42 45 <present> .gitattributes
; cat .git/filter-repo/analysis/blob-shas-and-paths.txt
=== Files by sha and associated pathnames in reverse size ===
Format: sha, unpacked size, packed size, filename(s) object stored as
c9bb54b53b825bdae31b68951f122247de6be4ef 6154 2645 README.md
e68f00d6215c6b87a68bb3448ee1e9b30279ae9d 261 175 README.md
a91825ccde6a06eab85d675ad507ee903dc585bd 131 122 svg-difference.png
d6994e2834dcd39977c1b25518dfb08f9b4e7142 131 121 svg-exclusion.png
c89203eb4b2bd470b6a40862ce0fda22f008cc4e 131 121 gegl-edge.png
bff68d1ae2bed842ef096461d72b29eb9cd7bd4d 131 121 svg-hard-light.png
a727c8fccd5fc5c2a7ff5e66552fb51b14e9a11d 131 121 svg-plus.png
63df66bb2949211365235bad8ac3b19d3fcc83cc 131 121 gegl-mix.png
51649f7e083b56741b8762007a7cf2f96e3d5077 131 121 gegl-wind.png
faa6aaf587e9aac5c1950da2a6addc9dec4eed1e 131 120 gegl-add.png
efe58b0893bbb71b7151379d9e2052be859eb8aa 131 120 svg-xor.png
ed36cc031bcdfe1fa4c77322f653c6609bd1fb11 131 120 svg-screen.png
e707476248cc5e8ff26f7c2c3828094bc2eb5952 131 120 svg-lighten.png
e2c4d3254ba55c3d50179793f383dd059002fbe2 131 120 svg-darken.png
d9ea63e8e893f466bbff268080f8fc0525009685 131 120 gegl-absolute.png
c2c571ff3f16f94ba76807e725139b9d4fac15d8 130 120 svg-src-out.png
a8ce95a24d4c17f59ce2a66bbbe5500187b36968 129 120 gegl-waterpixels.png
a574ac89cd0ec9b585c7cf4133dd5fe2fea5c26b 131 120 svg-color-burn.png
a44356cdf3f828b273d3ec4602018bc5c17aa681 130 120 svg-src-in.png
a379a3c6bf5527f60e7d72fcfd1ffaf1cfbdb684 131 120 svg-dst-out.png
a0fe9266278c412db765a630b47a425df6ea4aeb 131 120 gegl-whirl-pinch.png
9d8f9e7e51a5fae260d82372cde9529d30d31ab9 131 120 gegl-add.png
8281720869e95833ac518004e0d8194f239014e2 131 120 svg-color-dodge.png
689ff9704edaca3cdab19f41a07872fb6a7f8be9 131 120 svg-overlay.png
540833d12f3b072a5d78ad41c1892acaa6c0b5e1 131 120 gegl-weighted-blend.png
388225745a6ed7cb3d1a72ff93cd3233f3f38e47 131 120 svg-src-atop.png
1ee8f1266eb3eb675bd502f40b5cc45983adcaff 131 120 gegl-wavelet-blur-1d.png
1add3082540bffdf800820b6c19ff8a759e0263a 131 120 gegl-emboss.png
140febdbf800f80e727047e318eb039b224b034b 130 120 svg-dst-in.png
0c29560972496afde34de1ce5ad5b326572fb0c4 131 120 [gegl-absolute.png, svg-dst.png]
c07873e6fd0042018ca493f7a9622027023c1582 128 119 [gegl-warp.png, svg-clear.png]
b93ddce39c07fd4c78b0bf859d157eafb9c42efc 131 119 svg-dst-over.png
9a395ffd9b0d4dc54ba19dbe70c384c7bdd3bd43 130 119 svg-src.png
8e3a7f36af02582715a07cbaff6f98e2fa3f1496 130 119 svg-dst-atop.png
7cc5d4f709cef89ea796933c636221fa43e9a927 131 119 gegl-watershed-transform.png
5273c302e1e96c3d57fb07c6d29b0c5e77668aae 131 119 svg-src-over.png
1e4c4f5d7e51166bc128dee571a69ee47654cadf 131 119 gegl-wavelet-blur.png
24a8e87939aa53cdd833f6be7610cb4972e063ad 42 45 .gitattributes