# IPFVCS - a VCS (version control system) using IPFS!

**URL:** <https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753>\
**Category:** IPFS Love\
**Created:** [December 27, 2022, 12:34am UTC](https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753 "2022-12-27T00:34:28Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![DaniellMesquita](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/daniellmesquita/32/7300_2.png) [@DaniellMesquita](https://discuss.ipfs.tech/u/DaniellMesquita)\
**Post date:** [December 27, 2022, 12:34am UTC](https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753/1 "2022-12-27T00:34:28Z")

</div>

Thanks to [this friendo](https://superuser.com/questions/1759616/how-to-display-all-of-the-git-objects-of-a-working-tree-file?noredirect=1#comment2735135_1759616) I’ve met [this book](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain), but it wasn’t until [this page](https://git-scm.com/book/en/v2/Git-Internals-Git-Objects) that I had a inspiration. Understanding how a VCS’ filesystem works, specifically Git’s content-addressable approach (do you remember IPFS?), made me inspired (and brave enough) to start building my own VCS where the objects hashes (and commit hashes as well) are made with IPFS!  
(PS: well, not just that what inspired me, but also my frustrations with Git’s deduplication approach).

Here is IPFVCS’ repo: [GitHub - 01VCS/ipfvcs: [WIP] Test VCS using IPFS for object hashes! Should focus heavily on file deduplication and inspire on the work of the Pijul VCS](https://github.com/01VCS/ipfvcs) (pull requests are very welcome, hope you surpass me as the lead)

After cloning it, you can test by running “./ipfvcs init” then “./ipfvcs hash-object testfile.txt -w”. Now the next step will be to explore the .ipfvcs/objects folder and try to believe your eyes!

So, the basic file system is somewhat okay (basic comitting and deduplication isn’t yet a thing)

Hope you enjoy it!

There’s a more mature witchcraft by me: [GitHub - 01VCS/01: Git, on steroids. Layer2 for git, ready for the Web 3.0](https://github.com/01VCS/01) (with it you can replace git by a wrapper that may power it up - but use it at your sole responsibility)

---

<div class="post-metadata">

**Author:** ![DaniellMesquita](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/daniellmesquita/32/7300_2.png) [@DaniellMesquita](https://discuss.ipfs.tech/u/DaniellMesquita)\
**Post date:** [December 27, 2022, 12:39am UTC](https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753/2 "2022-12-27T00:39:13Z")

</div>

I’m open to (and will need) some feedback!

Question:

Will using IPFS’ hashing/CIDv0 (Qm…) make it waaay slower than git?

---

<div class="post-metadata">

**Author:** ![Akita](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/akita/32/2650_2.png) [@Akita](https://discuss.ipfs.tech/u/Akita)\
**Post date:** [December 27, 2022, 9:49pm UTC](https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753/3 "2022-12-27T21:49:28Z")

</div>

Make sure to have a look at IPLD([https://ipld.io](https://ipld.io)), as they worked on representing Git objects within the IPFS ecosystem.

IIRC, the problem was for objects of more than 1Mb, as go-ipfs wouldn’t transfer that by default. But now that PL is encouraging to create more diverse or specialised implementations, you could have one that follow different rules and use different defaults for libp2p. I think the rationale in go-libp2p was to mitigate Dos attacks by limiting to 1Mb the size of blocks by default meaning the amount of bad data you ingest before realising that it doesn’t match the requested CID.

Maybe you can massively raise the limit for the prototype, then find a strategy to mitigate the problem for you (big limits, user prompt when above limit, raising limit when remote peer behave correctly, accept onjects signed by trusted keys, etc).

I think git over IPFS worked well for object below 1Mb though.

---

<div class="post-metadata">

**Author:** ![Akita](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/akita/32/2650_2.png) [@Akita](https://discuss.ipfs.tech/u/Akita)\
**Post date:** [December 27, 2022, 9:57pm UTC](https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753/4 "2022-12-27T21:57:15Z")

</div>

It may have been this: [GitHub - ipld/js-ipld-git](https://github.com/ipld/js-ipld-git)

---

<div class="post-metadata">

**Author:** ![Akita](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ipfs.tech/akita/32/2650_2.png) [@Akita](https://discuss.ipfs.tech/u/Akita)\
**Post date:** [December 27, 2022, 10:08pm UTC](https://discuss.ipfs.tech/t/ipfvcs-a-vcs-version-control-system-using-ipfs/15753/5 "2022-12-27T22:08:07Z")

</div>

[![](https://us1.discourse-cdn.com/flex020/uploads/ipfs1/original/2X/d/d334b1621f11b12b652e03eed2bcc862e6a79bed.jpeg "Lightning Talk: Git + IPFS - Cody Hatfield") ](https://www.youtube.com/watch?v=dx7TH7-YSEQ)
