ENG | Uploading project to GitHub
A step-by-step guide on how to initialize a Git repository, add files, commit changes, and push your project to GitHub using the command line interface.
Motivation
If you’re a developer working on a project and need to store your code on a remote repository, GitHub is a popular choice. In this post, we’ll walk through the process of initializing a Git repository, adding files, committing changes, and pushing your project to GitHub using the command line interface.
Steps
- Create a new repository on Github (Repositories -> New) and select better name than
test-repo- Possibly add README.md and license.
- Initialize repository
1 2
$ git init Initialized empty Git repository in /home/pavel/projects/2023-05-15-test/.git/
- Check status
1 2 3 4 5 6 7 8 9 10 11
$ git status On branch main No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) test/ junk/ nothing added to commit but untracked files present (use "git add" to track) - Add files (well, directory inside may and may not be a good idea)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$ git add test* $ git status On branch main No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: test/.gitignore new file: test/CMakeLists.txt new file: test/README.md new file: test/main.cpp Untracked files: (use "git add <file>..." to include in what will be committed) junk/ - Commit changes
1 2 3 4 5 6 7
$ git commit -m "initial commit" [main (root-commit) 369bcaf] initial commit 4 files changed, 502 insertions(+) create mode 100644 test/.gitignore create mode 100644 test/CMakeLists.txt create mode 100644 test/README.md create mode 100644 test/main.cpp
- Verify
1 2 3 4 5 6
$ git log commit 369bcaf7efc01b3640e09a713a8189db267e8fae (HEAD -> main) Author: Pavel Perina <[email protected]> Date: Mon May 15 22:09:23 2023 +0100 initial commit
1 2 3 4 5 6 7
$ git status On branch main Untracked files: (use "git add <file>..." to include in what will be committed) junk/ nothing added to commit but untracked files present (use "git add" to track) - Add remote repository
1
$ git remote add origin [email protected]:pavel-perina/test-repo
- Push to github
1 2 3 4 5 6 7 8 9 10 11
$git push -u -f origin main The authenticity of host 'github.com (140.82.121.3)' can't be established. ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU. This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'github.com' (ED25519) to the list of known hosts. [email protected]: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.
Ok. Maybe I don’t have a SSH key on github. Let’s solve it:
There is an article about generating SSH keys which has also a paragraph dedicated to GitHub access troubleshooting.
- Go to github
- Click on profile icon
- Go to Settings (close to bottom)
- Go to SSH and GPG keys
- Click on New SSH key link
- Fill in some title (My Linux pub key)
- Go to
~/.sshon Linux box - Find something suitable, such as
id_ecdsa.pub - Copy content to clipboard and paste content to github page
1 2 3 4 5
$ cd ~/.ssh $ ls ... $ cat id_ecdsa.pub ecdsa-sha2-nistp256 AAAAE....efPg= pavel@...
- Try again
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$ cd ~/projects/2023-05-15-test/ $ git push fatal: The current branch main has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin main To have this happen automatically for branches without a tracking upstream, see 'push.autoSetupRemote' in 'git help config'. $ git push -u -f origin main Enumerating objects: 9, done. Counting objects: 100% (9/9), done. Delta compression using up to 4 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (9/9), 4.66 KiB | 1.16 MiB/s, done. Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To github.com:pavel-perina/test-repo + 4cde543...369bcaf main -> main (forced update) branch 'main' set up to track 'origin/main'.
Troubleshooting
Debug connection
1
GIT_TRACE=1 GIT_SSH_COMMAND="ssh -v" git push
Can’t authenticate during push: remote repository set HTTPS
If you pull your repository using HTTPS and you want to push changes, you may need to change origin from HTTPS to SSH:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[pavel@marten -=- ~/dev-c/slime_mold]$ git remote -v
origin https://github.com/pavel-perina/slime_mold.git (fetch)
origin https://github.com/pavel-perina/slime_mold.git (push)
[pavel@marten -=- ~/dev-c/slime_mold]$ git remote set-url origin [email protected]:pavel-perina/slime_mold.git
[pavel@marten -=- ~/dev-c/slime_mold]$ git push
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 767 bytes | 767.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To github.com:pavel-perina/slime_mold.git
21b4d31..d099423 main -> main
Confirm that SSH works
1
2
[pavel@marten -=- ~/dev-c/slime_mold]$ ssh -T [email protected]
Hi pavel-perina! You've successfully authenticated, but GitHub does not provide shell access.
I have some ssh keys on github and I forgot related file
Pub key from Linux
SHA256:WgusdU9lhLHLn8mpIgCSV2onsWoHXN56fUSzxTXZenE
Added on Mar 19, 2024
Last used within the last 5 weeks — Read/write
On Linux you can run
1
2
3
4
5
6
7
for key in ~/.ssh/id_*; do
if [ -f "$key" ] && [[ ! "$key" =~ \.pub$ ]]; then
echo "Checking: $key"
ssh-keygen -lf "$key"
echo ""
fi
done
Output might be
1
2
Checking: /home/pavel/.ssh/id_ecdsa
256 SHA256:WgusdU9lhLHLn8mpIgCSV2onsWoHXN56fUSzxTXZenE pavel@marten (ECDSA)
Authentication using public key fails
Problem might be having more keys on client and ssh does not know which one to use. Solution is .ssh/config in home directory on both Linux and Windows, such as:
1
2
3
4
Host github.com
User git
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ecdsa
Note that in the end it is best to have one ssh key per client and possibly delete it when access is compromised. Or protect keys by password. Or use hardware passkeys on work computer, notebook etc.
Summary
That’s all. It was meant to be brief.