First commit

This commit is contained in:
bursa-pastoris 2022-04-02 14:46:10 +02:00
commit 3054f253e8
3 changed files with 103 additions and 0 deletions

19
LICENSE Normal file
View File

@ -0,0 +1,19 @@
Copyright 2022 bursa-pastoris <bursapastoris at disroot dot org>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

67
README.md Normal file
View File

@ -0,0 +1,67 @@
`yagrmm` (Yet Another Git Remote Mirror Manager) is a simple script to
automatically update remote mirrors or git repositories. At the moment
`yagrmm` only works only if push and pull can be done without SSH keys without
passphrase or without authentication at all.
Whenever `yagrmm` is run, it will pull new commits from the original repo and
push them to the mirror. It can be run manually or periodically - e.g. with
`crontab`.
## Notice - Please read this
Some software provide the option to configure mirroring from the web interface,
so that the server automatically pulls commits from the original repo - that's
the case for
[GitLab](https://docs.gitlab.com/ee/user/project/repository/mirror/) and
[Gitea](https://docs.gitea.io/en-us/repo-mirror/#pulling-from-a-remote-repository).
If your provider uses one of these softwares but has disabled such function, he
probably has good reasons for doing so - usually limited server resources. If
your run `yagrmm` periodically, please limit yourself to the strictly necessary
and do not hoard your provider's resources.
## How-to
To use `yagrmm`, follow these steps.
1. Create a local mirror of the repository to mirror with `git clone --mirror
<original-repo-URL>`.
2. Add the path of the mirror to `~/.config/yagrmm/repolist`. `~` can be used
to refer to `/home/<user>` and is always expanded.
3. In the copy of the repository, edit `config` and in the section `[remote
"origin"]` add the following line below the one beginning with `URL = `:
pushUrl = <remote-mirror-URL>
so that the resulting section looks like
[remote "origin"]
url = <original-repo-URL>
pushUrl = <remote-mirror-URL>
fetch = +refs/*:refs/*
mirror = true
If - as you should - you push to the mirror with a key different from the one
you use to manual pushes to other repos (such as
[GitLab](https://docs.gitlab.com/ee/user/project/deploy_keys/) and Gitea's
deploy keys), you may find useful a trick to make SSH use the right one. You
must configure SSH adding a paragraph like the following to `~/.ssh/config`:
Host mirror.<remote-mirror-domain-name>
HostName <remote-mirror-domain-name>
IdentityFile <remote-mirror_push_key>
For example:
Host mirror.disroot.org
HostName disroot.org
IdentityFile ~/.ssh/mirror_push_key
And then you can use `mirror.<remote-mirror-domain-name>` as the domain name
for the `pushUrl`, for example
pushUrl = git@mirror.disroot.org:username/disroot-howto-mirror.git
# License
`yagrmm` is distributed under the [Expat (aka MIT) license](./LICENSE).

17
main.py Executable file
View File

@ -0,0 +1,17 @@
#!/usr/bin/python3
from pathlib import Path as path
from subprocess import run
home = str(path.home())
with open(home+"/.config/yagrmm/repolist") as repolist_file:
repolist = repolist_file.read().splitlines()
for i in range(len(repolist)):
repolist[i] = repolist[i].replace("~", home)
for repo in repolist:
print(repo)
run(["git", "-C", repo, "pull"])
run(["git", "-C", repo, "push"])