gitui icon indicating copy to clipboard operation
gitui copied to clipboard

Doesn't appear to push to multiple remotes, unlike `git push`

Open skyfaller opened this issue 3 years ago • 7 comments

Describe the bug I have multiple git remotes, as described in https://seirdy.one/posts/2020/11/18/git-workflow-1/

The repo in question is https://git.sr.ht/~skyfaller/twentyeleven-skyfaller

My .git/config looks like this:

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
[remote "origin"]
	url = [email protected]:~skyfaller/twentyeleven-skyfaller
	fetch = +refs/heads/*:refs/remotes/origin/*
	url = [email protected]:skyfaller/twentyeleven-skyfaller.git
	url = [email protected]:skyfaller/twentyeleven-skyfaller.git
[branch "master"]
	remote = origin
	merge = refs/heads/master
[remote "gh_mirror"]
	url = [email protected]:skyfaller/twentyeleven-skyfaller.git
	fetch = +refs/heads/*:refs/remotes/gh_mirror/*
[remote "cb_mirror"]
	url = [email protected]:skyfaller/twentyeleven-skyfaller.git
	fetch = +refs/heads/*:refs/remotes/cb_mirror/*

When I make changes to my git repo, and use gitui to Push [p], it only pushes to one remote, in this case GitHub / gh_mirror.

It appears it pushes to the remote which is listed last. This doesn't parallel git's behavior, git prioritizes the URL that is listed first when pulling:

> git pull origin -v
From git.sr.ht:~skyfaller/twentyeleven-skyfaller
 = [up to date]      master     -> origin/master
 = [up to date]      static     -> origin/static
Already up to date.

But since gitui should push to all of the URLs rather than picking one anyway, this isn't important.

When I use git push after using gitui to push, I see:

> git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 468 bytes | 468.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
To git.sr.ht:~skyfaller/twentyeleven-skyfaller
   e714d73..0370dee  master -> master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 468 bytes | 468.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To codeberg.org:skyfaller/twentyeleven-skyfaller.git
   e714d73..0370dee  master -> master
Everything up-to-date

As you can see, git push is successfully pushing to the other remotes that gitui did not.

Expected behavior I expect the behavior of git push and gitui's "Push" function to be identical.

Context (please complete the following information):

  • OS/Distro + Version: Fedora Linux 36 (Workstation Edition) x86_64
  • GitUI Version: gitui 0.21.0 (installed from Linuxbrew)

skyfaller avatar Aug 31 '22 22:08 skyfaller

oh wow I had no idea I could have it push to two remotes at the same time. TIL

extrawurst avatar Sep 02 '22 12:09 extrawurst

If you're curious, it doesn't appear to make a difference if I use pushurl instead, as suggested in https://brandonrozek.com/blog/git-pushing-multiple-remotes/. Something like this still results in gitui only pushing to one of the remotes:

[remote "origin"]
        url = [email protected]:Brandon-Rozek/website.git 
        fetch = +refs/heads/*:refs/remotes/origin/*
        pushurl = [email protected]:Brandon-Rozek/website.git
        pushurl = [email protected]:~brandonrozek/website

I personally prefer to have them all as url, it saves one duplicated line in the config and aesthetically I like them all looking equal, but if the ultimate fix required pushurl for some reason, I'm sure I would get over it.

skyfaller avatar Sep 07 '22 13:09 skyfaller

Open for PRs :)

extrawurst avatar Sep 07 '22 13:09 extrawurst

This issue has been automatically marked as stale because it has not had any activity half a year. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Mar 18 '23 06:03 stale[bot]

I've learned that I can fetch updates from all my remotes with:

> git pull --all
Fetching origin
Fetching cb_mirror
Fetching gh_mirror
Already up to date.

This doesn't actually pull from more than one remote, it's only fetching updates from the non-"origin" remotes, but I don't usually use git fetch in my workflow so this is easier to remember, and then at least I'll see if there are updates in other remotes which I can then integrate into the "origin".

I also usually push with:

> git push --all
Everything up-to-date
Everything up-to-date
Everything up-to-date

It's easy to forget to push other branches when working with multiple remotes, so even if git push --all shouldn't be necessary for pushing the branch I'm working on to other remotes, this helps make sure I keep the remotes in sync.

Frankly I don't fully understand Seirdy's (excessively complex?) git aliases and I don't use them.

skyfaller avatar Mar 27 '23 21:03 skyfaller

Would love to see functionality for pushing to multiple remote branches implemented. Like @skyfaller, I have projects with multiple remotes, but gitui seems unable to work with them (it crashes with pushing in these projects).

My ideal behavior would be: Press p to push changes and receive a dialog box asking which remote to push to.

But minimal desirable behavior would be something like @skyfaller suggests: git push --all as default behavior.

semioticrobotic avatar Nov 22 '23 21:11 semioticrobotic

unfortunatelty libgit2 does not seem to support remotes with multiple url or pushurl: https://libgit2.org/libgit2/#HEAD/group/remote/git_remote_set_pushurl

This assumes the common case of a single-url remote and will otherwise return an error.

we have to add that upstream first

extrawurst avatar Apr 07 '24 16:04 extrawurst