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?)
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).