Another option for individual files and stuff is to use the GitHub API with a custom plug-in to the built-in service connection framework.
Here's a service connection I wrote for it:
PacletInstall["ServiceConnection_GitHub",
"Site"->"http://www.wolframcloud.com/objects/b3m2a1.paclets/PacletServer"
]
Then we load it like this:
$gh = ServiceConnect@"GitHub"

We can see what requests are there:
In[73]:= $gh["Requests"]
Out[73]= {"AddFile", "ArchiveLink", "Authentication", "BranchInfo", \
"BranchProtection", "CreateOrganizationRepository", \
"CreateRepository", "DeleteFile", "DeleteRepository", \
"EditRepository", "ID", "ImportFile", "Information", "ListBranches", \
"ListMyRepositories", "ListOrganizationRepositories", \
"ListRepositories", "ListUserRepositories", "Name", "RawRequests", \
"ReadMeContents", "RemoveBranchProtection", "RepositoryContributors", \
"RepositoryInfo", "RepositoryLanguages", "RepositoryTags", \
"RepositoryTeams", "RequestData", "RequestParameters", \
"SetBranchProtection", "UpdateFile"}
So we'll start by making a testing repo. First we'll see what we need:
In[74]:= $gh["RequestParameters",
"Request" -> "CreateRepository"]["Required"]
Out[74]= {"name"}
So we'll give it a name like api-testing-repo:
In[80]:= $gh["CreateRepository", "name" -> "api-testing-repo"][{"id",
"name"}]//Normal
Out[80]= <|"id" -> 93099247, "name" -> "api-testing-repo"|>
Then we upload a file (note that it has to be Base64 encoded):
$gh[
"AddFile",
"user" -> "b3m2a1",
"repo" -> "api-testing-repo",
"path" -> "test.txt",
"content" -> Developer`EncodeBase64@"file_text_goes_here",
"message" -> "file upload test"
]["content", "sha"]
And we can see it exists:

Now we'll delete the file:
$gh[
"DeleteFile",
"user" -> "b3m2a1",
"repo" -> "api-testing-repo",
"path" -> "test.txt",
"sha" -> "6e560c960830951d7d77b0960cd961173ed86ce0",
"message" -> "file delete test"
]
And we'll see it no longer exists:

And now for good measure we delete the repo:
$gh[
"DeleteRepository",
"user" -> "b3m2a1",
"repo" -> "api-testing-repo"
]