{"componentChunkName":"component---src-gatsby-theme-chronoblog-templates-note-js","path":"/notes/git-ssh-keys-setup/","result":{"data":{"mdx":{"parent":{"__typename":"File","fields":{"gitLogLatestDate":"2026-06-18 16:18:28 +0200"}},"id":"b89f4d99-10ed-561a-a3a9-1ff7b390eae0","excerpt":"SSH keys let you authenticate with Git hosts without entering a password on every push or pull. This post covers generating keys for…","frontmatter":{"title":"Git SSH keys setup","date":"2026-06-19 00:01:00 UTC","job_ad":null,"job_ad_id":null,"job_ad_url":null,"tags":["git","ssh"],"cover":{"childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAPoAAAD6AG1e1JrAAAA50lEQVQoz62S626DMAyFef/HLO2mUsItgdxsvil0W0v/rJo4kqUoPjnOsV0BrOu6xfP5r/jhvqJ6V+DdqJ4r/gd7QageCUVEyTkTQqDrOpZlQURQUbxXnMs4m4lBSSmSUnqVpzImMvSFJOiq23URsdZ+P4r03UBzjZxrR31yG9+YFmMM41jyic4kgl+pzvVIcw3YaaG9NfT9gGkj9WnE3DLjMDHZ6f5zH4ghbk4KVIXOeD4/HJeLY5nXh2WRjPeeGCOzE4Y+Yq2Qs6CqzPNM27ZbKwqn2C1O9v0/YCj7wfyuDcetDQfjCzSmFGffkAspAAAAAElFTkSuQmCC","aspectRatio":2.0869565217391304,"src":"/static/72cd02aa3063259a5da454d70a1541f3/c4ecb/cover.png","srcSet":"/static/72cd02aa3063259a5da454d70a1541f3/57ab0/cover.png 192w,\n/static/72cd02aa3063259a5da454d70a1541f3/f4739/cover.png 384w,\n/static/72cd02aa3063259a5da454d70a1541f3/c4ecb/cover.png 768w","srcWebp":"/static/72cd02aa3063259a5da454d70a1541f3/dd090/cover.webp","srcSetWebp":"/static/72cd02aa3063259a5da454d70a1541f3/ae504/cover.webp 192w,\n/static/72cd02aa3063259a5da454d70a1541f3/fef30/cover.webp 384w,\n/static/72cd02aa3063259a5da454d70a1541f3/dd090/cover.webp 768w","sizes":"(max-width: 768px) 100vw, 768px","presentationWidth":768,"presentationHeight":366},"resize":{"src":"/static/72cd02aa3063259a5da454d70a1541f3/c4ecb/cover.png"}}}},"fields":{"slug":"/notes/git-ssh-keys-setup/","readingTime":{"text":"2 min read"}},"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Git SSH keys setup\",\n  \"date\": \"2026-06-19 00:01:00 UTC\",\n  \"cover\": \"./cover.png\",\n  \"tags\": [\"git\", \"ssh\"],\n  \"canonical_url\": \"https://sevic.dev/notes/git-ssh-keys-setup/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"SSH keys let you authenticate with Git hosts without entering a password on every push or pull. This post covers generating keys for multiple providers, loading them into the SSH agent, and cloning repositories over SSH.\"), mdx(\"p\", null, \"For general Git commands, see the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sevic.dev/notes/git-cheatsheet/\"\n  }), \"Git cheatsheet\"), \".\"), mdx(\"h3\", {\n    \"id\": \"generate-ssh-keys\"\n  }, \"Generate SSH keys\"), mdx(\"p\", null, \"Generate a separate key for each provider (for example, GitHub and Bitbucket). Run \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ssh-keygen\"), \" for each key, set a distinct filename, and optionally add a passphrase.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"ssh-keygen -f ~/.ssh/id_rsa_github\\nssh-keygen -f ~/.ssh/id_rsa_bitbucket\\n\")), mdx(\"h3\", {\n    \"id\": \"add-public-keys-to-providers\"\n  }, \"Add public keys to providers\"), mdx(\"p\", null, \"Copy each public key (the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".pub\"), \" file) and add it to the provider:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://github.com/settings/ssh/new\"\n  }), \"GitHub\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"https://bitbucket.org/account/settings/ssh-keys/\"\n  }), \"Bitbucket\"))), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"cat ~/.ssh/id_rsa_github.pub\\ncat ~/.ssh/id_rsa_bitbucket.pub\\n\")), mdx(\"h3\", {\n    \"id\": \"activate-ssh-keys\"\n  }, \"Activate SSH keys\"), mdx(\"p\", null, \"Start the SSH agent and add the keys you need for the current session.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"eval \\\"$(ssh-agent -s)\\\"\\nssh-add ~/.ssh/id_rsa_github\\nssh-add ~/.ssh/id_rsa_bitbucket\\n\")), mdx(\"p\", null, \"Verify the connection to a provider:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"ssh -T git@github.com\\nssh -T git@bitbucket.org\\n\")), mdx(\"h3\", {\n    \"id\": \"shell-aliases-per-provider\"\n  }, \"Shell aliases per provider\"), mdx(\"p\", null, \"Add aliases to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"~/.bashrc\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"~/.zshrc\"), \" to run the agent setup and load the correct key in one command.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"alias ssh-github='eval \\\"$(ssh-agent -s)\\\" && ssh-add ~/.ssh/id_rsa_github'\\nalias ssh-bitbucket='eval \\\"$(ssh-agent -s)\\\" && ssh-add ~/.ssh/id_rsa_bitbucket'\\n\")), mdx(\"p\", null, \"Reload the shell configuration, then run the alias before working with that provider:\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"source ~/.zshrc\\nssh-github\\n\")), mdx(\"h3\", {\n    \"id\": \"clone-repositories\"\n  }, \"Clone repositories\"), mdx(\"p\", null, \"Use the SSH remote URL when cloning. The host (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"github.com\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"bitbucket.org\"), \") determines which key the provider expects.\"), mdx(\"pre\", null, mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"# git clone <REPOSITORY_URL>\\ngit clone git@github.com:workspace/repo-name.git\\ngit clone git@bitbucket.org:workspace/repo-name.git\\n\")), mdx(\"p\", null, \"If authentication fails, run the matching alias (for example, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"ssh-github\"), \") and try again.\"));\n}\n;\nMDXContent.isMDXComponent = true;"}},"pageContext":{"id":"b89f4d99-10ed-561a-a3a9-1ff7b390eae0"}},"staticQueryHashes":["1961101537","2542493696"]}