Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Forking a GitHub repo using from the command line with bash, cURL, and the GitHub API

I am having trouble with my bash script to fork a GitHub repo using cUrl.
The gitHub API doc for creating a fork.

I've tried many variations:

curl -u $my_user_name https://api.github.com/repos/forks -d "{\"owner\":\"$upstream_repo_username\",\"repo\":\"$upstream_repo_name\"}"

and
curl -u $my_user_name https://api.github.com/repos/'$upstream_repo_username'/'$upstream_repo_name'/forks

yield the following error: { "message": "Not Found", "documentation_url": "https://developer.github.com/v3" }

In Contrast, the following Creates a new empty github repo, as expected:
curl -u $my_user_name https://api.github.com/user/repos -d "{\"name\":\"$upstream_repo_name\"}"

Any ideas on how to create a fork of a repo from the command line?

I have a bash script that: - creates an empty repo on github with the name of the repo I'm going to clone, - clones a repo from another user locally, and - pushes my cloned repo into the empty repo I created in my github account - sets origin and upstream remotes appropriately

However, this method does not keep a connection within GitHub to the source (forked) repo. I particularly like the convenience of the forked link appearing below my own repo name ;-)

The goal is to do all my cloning (and forking) from the command line.

I do not want to open a browser, navigate to the repository I wish to fork, just to access that "Fork" button.. only return back to the command line to finish the process.

Alternatively, can I turn a cloned repo into a forked one from the command line? (ie some command line api command that will re-create those internal github links that forks possess?)

like image 568
SherylHohman Avatar asked May 31 '17 01:05

SherylHohman


People also ask

How do I fork a Git repo from command line?

If you need to fork a GitHub or GitLab repo, it's as simple as navigating to the landing page of the repository in your web browser and clicking on the Fork button on the repository's home page. A forked copy of that Git repository will be added to your personal GitHub or GitLab repo. That's it.

How do I fork a GitHub repository in Git bash?

You can fork any repo by clicking the fork button in the upper right hand corner of a repo page. Click on the Fork button to fork any repo on github.com. Source: GitHub Guides.

How do I fetch API in GitHub?

To get the list of random users, you have to make a request to the /user endpoint, and to get the details of a specific user, you make a request to the /user/{username} endpoint. You can try out the following commands quickly in your terminal with curl to see the results.

How do I fork on GitHub?

To follow along, browse to a public repository that you want to fork. At the top right of the page, you will find the Fork button. Click on the button and wait for a few seconds. You will see that the newly forked repository gets created under your GitHub account.


1 Answers

Here is my working bash script:

curl -u $my_user_name https://api.github.com/repos/$upstream_repo_username/$upstream_repo_name/forks -d ''

Example using hard-coded strings instead of bash variables:

curl -u 'SherylHohman' https://api.github.com/repos/octocat/Hello-World/forks -d ''

Notice I moved -d '' to the end to avoid login errors.
The request requires authentication.
I provide this via curl's -u parameter (as opposed to using OAuth2).
When I used the -u $my_user_name option,
I had to move the -d '' to after the URI
- it resulted in login errors if placed between -u 'username' and the URI.

It turns out the Main source of errors in my script with bash-syntax.
I had quotation marks surrounding bash variables, that should Not have been there.
(..just Solving a pain point without really knowing bash or curl)

Additionally, as #YuriSchimke pointed out, this particular URI required parameters to be passed in the URI. Passing these options as json is not an option, unlike the URI for Creating a New Blank repo.

Here is why I was baffled over how to send this data in the URI:

Using curl, the default request is a GET.
In curl, POST requests are made by adding the -d (equivalent to --data) flag followed by the data to be sent.

I needed to send a POST request.
The format for GitHub API is that GET (and POST eg. CreateRepo) requests can sometimes send some parameters as json or query strings
NOTE: documentation for GitHub API appears to be slightly incomplete, as I do not see any mention of the API allowing json, only query string.
I suppose in this case, the data is sandwiched between two static URI parts, making it impossible to send as json values.

I was at a loss how to use the -d flag without data:

If I simply left it off, the API call was processed as a GET.
It returned information about the repo I wanted to fork,
instead of forking the repo to my account.

@YuriSchimke's post gave me that "Ahaa!". Thanks! I'm laughing that it didn't cross my mind. I'm grateful Yuri's made this so obvious! (Thanks Again).

like image 81
SherylHohman Avatar answered Nov 15 '22 07:11

SherylHohman