 As a long-time Linux user, I'm amazed that sometimes I come across these applications that I've never heard of these applications that have been around for years. I've never heard of most of you guys have never heard of and when I investigate them like they're totally game changing kinds of programs. Like it's a kind of program that I think most people need to know about and many of you guys that are watching this right now will probably find very, very useful. And today I'm going to talk about a program called GetAnX. GetAnX, again, has been around for years. What does GetAnX actually do? Well, it does a lot of stuff, right? Their website covers a lot of various scenarios that GetAnX can help you with. But basically what I'm going to do today, I'm going to show you two scenarios that I've played with here in the last couple of days using GetAnX that I thought were amazing. And that was basically being able to sync large files between two different computers or between a computer and a remote repository. Because by default, Get, the program Get, can't handle large files. That's not really how it was designed. Certainly your Get hosts like GitHub, GetLab, they have file size restrictions on them. And what GetAnX allows you to do is actually work with very large files using Get because it uses a very unique system of SIM links, basically, to handle this. So let me start by demonstrating how you can sync files between two local folders on your system. So maybe you want to sync some very large files between a Get repository that's hosted locally on your system. And maybe also have that in a Dropbox folder or a NextCloud folder, some cloud syncing folder service also on your system. Well, let me switch to an empty workspace here and switch to the desktop. So let me open a terminal and I'm going to zoom way in here. First of all, you need to make sure that you have GetAnX installed on your system for those of you using Arch or an ArchBase Linux distribution. It's in the standard repositories. So install it with sudo pacman dash capital S GetAnX is the program name. And I'm assuming GetAnX will probably be in most Linux distributions repositories because it's free and open source software. And again, it's been around for a number of years and it does have a few dependencies, but it only really has one real dependency. Obviously, Get also needs to be installed on your system. And then it has several small Haskell libraries as a dependency. So don't be surprised when you install it and installs like 60 or 70 packages. But almost all of that is these really tiny Haskell libraries it installs really in just a few seconds. So I'm going to CD into my downloads directory because I want to work in my downloads directory rather than my home directory just because there's less stuff in it. And let's make a new Get repository. So I'm going to do a make dir for make directory. And I'm going to create a directory called my repo. And if I CD into my repo and do an LS, of course, it's an empty directory. Let's make this a Get repository. Now to make something a Get repository, you need to run Get a net. So initialize it as a Get repository. I'm going to get some warnings here because I haven't got my Get a net configured to where it fills out all the necessary information. It's just a warning. It is still created this as a Get repository. You see now that when I run an LS, I have .get that hidden directory here. So my repo is now a Get repo. Now we also need to initialize this as a Get annex repository as well. And you do this with Get space annex. Every Get annex command is Get space annex space arguments. And in this case, we need to run Get annex and yet. And then give it some kind of name or description, something one word. So what I'm going to do, this repository, this local folder here is going to be file syncing these files within it to another file on my system. I'm going to sync it to my next cloud directory. So I'm going to call this one file sync. So that is going to be the description for this Get annex repository. So let's get that. Now you need to be aware that you can't actually run Get annex and yet until you run the standard Get and yet. So it needs to be initialized with Get first for the Get annex and yet to actually work. Now let's actually create some files. So I'm going to touch, we'll call this big file. We're just going to create a file. I'm going to call it big file. I'm also going to touch large file by doing LS. There's big file and large file. We're just going to imagine that these are really big files that typically something like a Get hub, Get lab, you know, these Get hosting services typically to have a hard time handling. Even though I'm not going to make them that big, but I will put something in them. Why don't we echo this is line one and direct that to big file by cat big file. Now, you know, it has one line of text within it. And let's go ahead and also cat. This is another line one. And we're going to cat that into large file just so it has something in it as well. And the reason I'm putting some content into this file, even though I'm not going to make it a gigantic file, it does need to have some identifiable text because we want to be able to verify that the sim linking and all of that works later. Now, typically with get once you have some files that you want to version control with a get repository, you do a get add name of file. We want to do this with get annex though, because really syncing these large files needs to be done with get annex. So let's do get annex add and we'll add a big file. Let's also add large file. And you can see that get annex added big file and large file. And of course, after adding the files, you need to do a commit and this you could just do a standard get commit. And I'm going to do added a big file and a large file as the commit message. And that's all I'm going to do in this repository for right now. Now I'm going to open up a second terminal because now what I want to do is I'm going to CD into my next cloud directory, which in my case, I just call NC. And I'm going to go ahead and make dear because I want to make a new repository for get annex within my next cloud directory. I will name it annex just so it's obvious that that particular folder is a syncing of get annex. And I'm going to CD into annex by doing LS. Of course, it's an empty directory. And just like we initialized the my repo directory, we need to initialize this. So first let's do a get a net. So just the standard get a net. And then let's do a get annex a net. And this time I'm going to name this one next cloud instead of fall sync. So it's obvious anytime I run a command pointing to fall sync. It's pointing to my repo anytime I run a command and specify next cloud. It's specifying NC slash annex. So let's run the unit. Now we need to make each folder each of these get annex repositories aware of each other. Because right now the NC annex directory doesn't know about the downloads my repo directory and vice versa. So let me clear the screen. I'm going to go to the first directory we did, which was the my repo. So what we need to do is add a remote. So I'm going to do a get remote add. And the remote we need to add is next cloud. So we're letting the fall sync repository over here know about the remote next cloud repository over here. It's basically what we're doing. So you have to give it the name, right? But you also have to specify the location, which in my case was my home directory slash NC slash annex. Because that was the directory we created. So that is the command. Let me make that full screen so you guys can see that get remote add next cloud, which was our name, our description. And then the location to that repository, which in my case NC slash annex. Now we need to do the same thing in the NC annex directory, right? So let me clear the screen here and do the same thing get remote add. And this time we're adding fall sync because that's what this get annex repository. We described it as the fall sync repository. And then the location to it is in my home directory slash downloads slash my repo. Again, let me make that full screen so you can see the full command. And now that we've added those, these two repositories should be aware of each other. Now what we need to do is actually run a sync between the two repositories. So if I start with my repo repository, which actually has the files in it and run get annex sync. Just run that, you're going to get some output and the sync is successful. Now if I go over here and do an LS still nothing is in this repository yet because you also have to come over to this one and do get annex sync. And now when I do an LS over here, you see I actually have big file and large file. But I don't really have big file and large file because if I cat big file, there is no such file or directory because these are really not actual files. If you can see this, let me make this full screen, you see big file and large file are actually sim links. You see the hashes here, the very long string of numbers here. So those are just sim links. They contain some information to let get annex know exactly where the actual files exist. They exist actually in another directory. They don't actually exist in this directory. Now if you wanted to actually get the actual file itself like if you wanted to pull down this big file and actually get the content you had to do get annex, you could do get annex add name of file. If you wanted to do big file, for example, or if you want everything, what I would do here is get annex sync space dash dash content. So this time it's running the sync and then the dash dash content flag is letting us know. I don't just want the sim links. I don't want to have a sim link pointing to something. I want the actual file itself and let's run that and now run it LS and you see now. I still have the files here. They still contain some sim links, but they are the actual files. If I run the cat on big file, you can see this is line one. So I actually have the data that is actually contained in the file rather than just a sim link now. So I find that very fascinating. The fact that you can have in this case, I was using two repositories locally on my machine, but it could have been multiple repositories and they don't necessarily have to be local. They could have been on remote machines and you know, you could have some very large files that maybe again, get is kind of clunky moving large files around, but with get annex, it's all sim links, right? It's only an actual file when it needs to be an actual file and then you can specify, hey, please pull down that gigantic file, the actual content. When you don't need it, you're just dealing with sim links and I think that's great. I actually think that's really unique and really an ingenious way of dealing with this problem. Of course, I mentioned that GitHub and GitLab have real problems dealing with large files. They actually set restrictions on this. So how would you do this with something like GitLab, for example? Well, let me switch back over to the desktop and close these out here and go back to my web browser here. And I'm going to go to my GitLab and just for funsies, what I'm going to do, I'm going to go to my projects here and I'm going to create a new project and create a blank project. I'm going to call this test repo project. URL is going to be my GitLab slash test repo. I'm not going to give it a description. It can be private repository. I'm just going to blow away this repository. Once I'm done with the video initialize repository with a read me. Yeah, sure. Why not? And then create the project. And now that I've got this remote test repository hosted on my GitLab, let me grab the URL to clone it. I'm going to clone it with SSH so I don't have to deal with passwords because my machine will know about my SSH keys. So once again, I will get into a terminal, zoom in a little bit. I'll CD into downloads once again. And then I'm going to run the Git clone and then give it the URL that I copied over from GitLab for the test repo. Now that it has cloned that, let's CD into test repo. I'm at LS and there is, of course, the hidden folder, the .git folder and the read me. We told it to auto generate. So we've already got one file that's got some text here, the read me.md. Let's go ahead and also touch a big file once again. And once again, let's echo something. I'll just echo. This is line one once again into big file. Now let's go ahead and initialize this repository. We don't need to do a git init because we already did that on the GitLab website. It initializes the repository for us, but we do need to run the git init. And then I, of course, need to name it something. I'm just going to call this one big files. Now let's do a git init add. So git init add, what do we want to add using git init? Let's add everything. So let's just do the period. So that means everything within this directory. So that'll be big file and read me.md. It'll ignore .git directory, that hidden directory. So no worries there. It looks like it did not add the read me. It says add big file. Okay. But it didn't mention anything about read me. I wonder because read me was already added using standard git. Let me try just adding specifically git nx add read me. Nothing is returned. The read me is not adding correctly, but we added big file. We got one file added for testing purposes here. Let's go ahead and run a commit. I'm going to git commit dash git added a big file. Let me run a git log just to check on things here. And yeah, all we have is the initial commit. And that was when I created the repository over on GitLab and the added big file commit. Now let me run a git nx sync dash dash content. And I believe the git nx sync dash dash content essentially is kind of like a git push, right? I believe now I should be able to go back to the browser to test repo. And if I refresh this, oh, look at that. Big file. So I have read me, which was here when we created this. And then now I have big file. Now let's read big file right here on the GitLab website. And that is not the contents of big file, right? Because the contents should have been this is line one. But instead all we get is once again the very long numbers, the very long string of numbers, right? The hash. Again, this is just a reference to a sim link, right? So this is not the actual file here on the GitLab. And if this was actually a big file, that's exactly what we would want. We wouldn't, because you couldn't have a big file on GitLab. But now you have this sim link that actually points to a repository locally on your machine, or it could be, you know, on another machine, but it points to somewhere where you can actually have that large file stored. And if somebody wants to pull it down, they can because that sim link points to it. And that's cool. I don't know if you guys are as fascinated with this as I am, but I've been blown away by Gitanax. And again, I just scratched the surface here with Gitanax because this thing is deep. There is so much stuff you can do with it. I'm looking at key concepts, special remotes, so various services it can use, including Amazon Glacier and BitTorrent, R-Sync, S3, Web Dev, Git, of course, we've been playing with, but there's so much stuff here. I doubt the developer probably has this tested all of this. I'm sure there's multiple developers, but there's so much stuff you could potentially do with Gitanax. They have a variety of scenarios, use cases, and, you know, all I did was what I consider the most basic use of Gitanax, which is syncing very large files that typically, again, you can't do with just the standard Git command. So I'm going to keep playing with Gitanax as I find more really cool use cases with it. I'm probably going to make more videos about this because, again, I think this is a tool that I had never heard of, and, again, I don't think most of you guys have ever heard of, and I think it deserves a lot more attention. Anyway, before I go, let me thank a few special people. I need to thank the producers of the show, Devon Gabe James Maximette, Michael Mitchell, Paul Scott West, Alan Armoredragon, Chuck Mandarin Reed, Diokai, Dylan George, Lee Lennox-Ninja, Mike Erion, Alexander, P Sgt. Fedor, Polytech, Red Prophet, Steven and Willie. These guys, they're my has-teared patrons over on Patreon without these guys. This episode you just watched would not have been possible. The show is also brought to you by each and every one of these ladies and gentlemen. All these fine ladies and gentlemen, they support me over on Patreon because I don't have any corporate sponsors. It's just me and you guys, the community. If you like my work and you want to see more shows about Linux, free and open source software, cool tools like Gitanax, subscribe to DistroTube over on Patreon. All right, guys. Peace. Is there anything you can't do with Haskell?