Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Convert HTTPS github clones to use SSH
#/bin/bash
#-- Script to automate https://help.github.com/articles/why-is-git-always-asking-for-my-password
REPO_URL=`git remote -v | grep -m1 '^origin' | sed -Ene's#.*(https://[^[:space:]]*).*#\1#p'`
if [ -z "$REPO_URL" ]; then
echo "-- ERROR: Could not identify Repo url."
echo " It is possible this repo is already using SSH instead of HTTPS."
exit
fi
USER=`echo $REPO_URL | sed -Ene's#https://github.com/([^/]*)/(.*).git#\1#p'`
if [ -z "$USER" ]; then
echo "-- ERROR: Could not identify User."
exit
fi
REPO=`echo $REPO_URL | sed -Ene's#https://github.com/([^/]*)/(.*).git#\2#p'`
if [ -z "$REPO" ]; then
echo "-- ERROR: Could not identify Repo."
exit
fi
NEW_URL="git@github.com:$USER/$REPO.git"
echo "Changing repo url from "
echo " '$REPO_URL'"
echo " to "
echo " '$NEW_URL'"
echo ""
CHANGE_CMD="git remote set-url origin $NEW_URL"
`$CHANGE_CMD`
echo "Success"
@icyflame
Copy link

icyflame commented Apr 6, 2016

Modified it to work for all the remote URLs in a particular git repository. It loops through the output of git remote and changes everything to SSH. (Handy if you are moving from a proxied environment to an open one.)

https://gist.github.com/icyflame/532edee5422baeabac56d111f642bd73

Copy link

ghost commented Apr 8, 2016

Works beautifully - thanks @brettalton!

@mcouthon
Copy link

mcouthon commented May 25, 2016

Excellent job. Worked flawlessly!

@RichardLitt
Copy link

RichardLitt commented Sep 23, 2016

I made this into an npm module. Not perfect, but works. https://github.com/RichardLitt/github-origin-https-to-ssh

@kajuwise
Copy link

kajuwise commented Jan 10, 2017

Useful script for lazy people!
Used with:
echo "Navigating to $1"
cd "$1"
to specify repo location via argument.

@gitfrage
Copy link

gitfrage commented Apr 13, 2017

or just edit [remote "origin"] section in .git/config

@phinze
Copy link

phinze commented May 6, 2017

Hi folks! FYI git supports this as a configurable nowadays:

git config --global url."git@github.com:".insteadOf "https://github.com/"

@roy-bukapeta
Copy link

roy-bukapeta commented May 17, 2017

git config --global url."git@github.com:".insteadOf "https://github.com/"

Best way to convert https to use ssh

@simonherbert
Copy link

simonherbert commented Jan 27, 2018

Thanks! Works perfect without any complicated stuff :-)

@seanlerner
Copy link

seanlerner commented Mar 15, 2018

thx @phinze & @roy-bukapeta
your solution worked well for me.

@damokuro
Copy link

damokuro commented Mar 21, 2018

fixed it for repository names that don't end in .git:
https://gist.github.com/Dam0cles/51b0b3e711bf50499f0e23415b6a6e46
Also, (.*).git in sed with an unescaped . is dangerous as it could match https://github.com/User/Legit as "L" for this kind of repository.

@wjholden
Copy link

wjholden commented Sep 12, 2018

Thank you!

@cdsandoval
Copy link

cdsandoval commented Mar 2, 2019

To note, @m14t is simply running one command here, but is gathering useful information from the 30 lines above. If you know the SSH URL, you can simple run,

git remote set-url origin git@github.com:username/repo-name-here.git

Where username is the username of the repo owner and repo-name-here is the name of that user's repository.

The URL can be found in the repositories homepage in this box,

SSH URL

I hope that helps!

Thank you !!

@srghma
Copy link

srghma commented May 31, 2019

@spacemudd
Copy link

spacemudd commented Jun 9, 2019

This worked beautifully. Thank you.

@karansapolia
Copy link

karansapolia commented Sep 19, 2019

To note, @m14t is simply running one command here, but is gathering useful information from the 30 lines above. If you know the SSH URL, you can simple run,

git remote set-url origin git@github.com:username/repo-name-here.git

Where username is the username of the repo owner and repo-name-here is the name of that user's repository.

The URL can be found in the repositories homepage in this box,

SSH URL

I hope that helps!

Hey thanks! 😄

@gerryfrank10
Copy link

gerryfrank10 commented Mar 11, 2020

Nice Work, This saved me from a lot of work

@shivams
Copy link

shivams commented Jul 25, 2020

This is what I use for changing my remote from HTTPS to SSH, and it works for any repository (Github, Gitlab, Bitbucket or private Git server):

#The if condition is for checking your remote HTTPS URL has `.git` at the end or not
if git config --get remote.origin.url | grep -P '\.git$' >/dev/null; then 
    newURL=`git config --get remote.origin.url | sed -r 's#(http.*://)([^/]+)/(.+)$#git@\2:\3#g'`
else
    newURL=`git config --get remote.origin.url | sed -r 's#(http.*://)([^/]+)/(.+)$#git@\2:\3.git#g'`
fi;

echo "Does this new url look fine? (y/n) : " $newURL
read response
if [[ "$response" == "y" ]]; then 
    git remote set-url origin $newURL; 
    echo "Git remote updated."; 
else 
    echo "Git remote unchanged."; 
fi;

@prabinb
Copy link

prabinb commented Jul 31, 2020

Thanks @m14t. You saved my day!

@ptanmay143
Copy link

ptanmay143 commented Sep 27, 2020

This is what I use for changing my remote from HTTPS to SSH, and it works for any repository (Github, Gitlab, Bitbucket or private Git server):

#The if condition is for checking your remote HTTPS URL has `.git` at the end or not
if git config --get remote.origin.url | grep -P '\.git$' >/dev/null; then 
    newURL=`git config --get remote.origin.url | sed -r 's#(http.*://)([^/]+)/(.+)$#git@\2:\3#g'`
else
    newURL=`git config --get remote.origin.url | sed -r 's#(http.*://)([^/]+)/(.+)$#git@\2:\3.git#g'`
fi;

echo "Does this new url look fine? (y/n) : " $newURL
read response
if [[ "$response" == "y" ]]; then 
    git remote set-url origin $newURL; 
    echo "Git remote updated."; 
else 
    echo "Git remote unchanged."; 
fi;

Fixed an error on line 5. Unexpected ; after else.

@shivams
Copy link

shivams commented Sep 28, 2020

@ptanmay143 Thanks for the fix for the typo bug. I've updated my comment as well.

@abd3lraouf
Copy link

abd3lraouf commented Dec 21, 2020

One line

wget https://bit.ly/https_ssh_manoo -O- | bash

From my fork: Here

@nurshom
Copy link

nurshom commented Jan 13, 2021

Awesome! Made my life so much easier.

@moneer-muntazah
Copy link

moneer-muntazah commented May 30, 2021

Hi folks! FYI git supports this as a configurable nowadays:

git config --global url."git@github.com:".insteadOf "https://github.com/"

Thank you so much

@skahvedzic-ca
Copy link

skahvedzic-ca commented Jun 30, 2021

Nice work! Thanks!

@alexandre-hanriot
Copy link

alexandre-hanriot commented Jul 28, 2021

To note, @m14t is simply running one command here, but is gathering useful information from the 30 lines above. If you know the SSH URL, you can simple run,

git remote set-url origin git@github.com:username/repo-name-here.git

Where username is the username of the repo owner and repo-name-here is the name of that user's repository.

The URL can be found in the repositories homepage in this box,

SSH URL

I hope that helps!

Thanks for the help !

@roeniss
Copy link

roeniss commented Aug 14, 2021

Thank you so much guys!

@ForceGT
Copy link

ForceGT commented Sep 18, 2021

Point to be noted is that if you use Xcode with Swift Package Manager then this is going to cause issues for you as Xcode by default doesn't respect this , and continues to use its own way of doing things. It is a really irritating bug. You can check this SO question for more details

https://stackoverflow.com/questions/58165880/xcode-11-spm-authentication-failed-because-no-credentials-provided

@siduck
Copy link

siduck commented Jan 15, 2022

@brettalton thanks for the one liner!

@CodeIter
Copy link

CodeIter commented Apr 9, 2022

Hi, in case someone need to get git remote url as https, whatever your remote Git repository settings are.
more at https://gist.github.com/CodeIter/be215cfef4ec1af5e1a10c4563944869

[ -z "${GITHOST}" ] && GITHOST="github.com"
[ -z "${GITBRANCH}" ] && GITBRANCH="origin"
git remote -v \
| grep "${GITBRANCH}" | grep fetch | head -n 1 \
| sed -re 's~\s+\(fetch\)$~~' \
      -re 's~([^/ :]+/[^/ :]+)$~#\1~;s~^[^#]+#+~~' \
      -re 's~(github\.com)~\1/~' \
      -re '/^https?:\/\//!s~^~https://'"${GITHOST}"'/~'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment