git svn branch results in "Server SSL certificate verification failed" - git-svn

Using git svn works without issue for all operations except when I try to use git svn branch.
When I try git svn branch newbranch -m "another branch" from a local repo that was previously successfully cloned using git svn clone --stdlayout, I get the following error:
Can't create session: Unable to connect to a repository at URL 'https://mysvnserver.blah/path/to/svn/project/trunk': Server SSL certificate verification failed: issuer is not trusted at C:\Program Files\Git\mingw64/libexec/git-core\git-svn line 1199.
The error doesn't make a lot of sense as git svn works correctly with other commands (eg. rebase, dcommit etc). And dcommit does successfully write changes back to the remote subversion repository.
I am using git version 2.10.2.windows.1

From the git-svn doc,
branch
Create a branch in the SVN repository.
It creates a branch in the svn repository, This will commit to svn repository. This is possible only if you have write access to the repository root which you would have cloned using git. Just provide the write access in svn repository and it should work.

Related

Git directly commit file to git and/or gitlab

So, here's my use case:
I'm attempting to develop an internal Mac app for the non-developers on my team, to edit some of my game's parameters. Ideally, the application will be able to recreate the necessary config files and directly commit/push them to my gitlab instance, which would trigger a CI build.
I know I could programmatically clone my repo to their machine and then edit it programmatically and commit the changes, but I'm trying to avoid having to have each user who is only editing a few files cloning 2+GB of code.
Any suggestions how to commit directly to a remote repo? In this case, both the user and my server can be considered "trusted". Thanks!
That would look like those config file could be in their own (very small) git repository, and kept in the main repo as a submodule.
However, once a submodule has been pushed back, a hook should make sure the parent repo update its submodule reference (git submodule update), and add+commit the new SHA1 of said submodule which was just pushed.
Otherwise, the parent repo wouldn't realize that its submodule has changed.
That also means the parent repo should declare that submodule as following the latest SHA1 of master branch:
git submodule add -b master /url/to/submodule
For something as restricted as this a single-repo solution would also work:
Make a configs-only branch:
git checkout --orphan configs
rm all but configs
git add -A
git commit -mconfigs
git checkout main
git push server configs
In the config-editor repos:
git init configrepo
git remote add server u://r/l
git fetch server configs
git checkout -t server/configs
# work work, then
git commit -am "new configs"
git push
As part of your build,
git pull -Xtheirs configs

Git SVN Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item

I have a SVN server shared by other teams and I have a new project to commit to SVN.
First, I add it to Git control by:
git init
Then, add all files to Git by:
git add .
Then, commit all files to Git by:
git commit -am "Initial Commit"
Then, I link up with SVN by :
git svn init https://my_account#my_svn_server_host.com/svn/external/trunk/projectA/
where projectA folder does not exist. Then, I try to fetch updates from server:
git svn fetch
Errors arrived.
W: Filesystem has no item: '/svn/external/!svn/bc/5060/trunk/projectA'
path not found at /usr/libexec/git-core/git-svn line 1801
W: Ignoring error from SVN, path probably does not exist: (160013):
Filesystem has no item: '/svn/external/!svn/bc/5060/trunk/projectA'
path not found
W: Do not be alarmed at the above message git-svn is
just searching aggressively for old history. This may take a while on
large repositories
Then I try to dcommit:
git svn dcommit
Then, it gives :
Unable to determine upstream SVN information from HEAD history.
Perhaps the repository is empty. at /usr/libexec/git-core/git-svn line 541.
What did I miss?
I am using Mac OS X 10.7 , MacPorts 2.2.0
UPDATE: According to #Wes's answer, here is the result :
# git init
Initialized empty Git repository in /Users/path/to/my/projectA/.git/
# git checkout -b "mychanges"
fatal: You are on a branch yet to be born
# git checkout master
error: pathspec 'master' did not match any file(s) known to git.
Oops! Seems not working.
You really can't do it that way. git svn requires that you have a linear history (ok, git doesn't; svn itself does). So all of your git work must end up on the end of the commit-tree for svn.
The right thing to do is use git svn clone first to mirror the remote repository and then make commits to that checked out version and run git dcommit.
Yes, there are other ways to do this, but the way you are doing it above makes a commit before pulling in the remote content, which won't work.
If you're just trying to add all your existing changes to the version from the remote, you can probably do it this way:
# git init
# git checkout -b "mychanges"
# git checkout master
# git svn init ....
# git svn fetch
# git checkout mychanges
# git rebase master
# git checkout master
# git merge --ff-only mychanges
# git dcommit
That's untested, but it should do what you want.

How to import local git repository into svn?

I am working on local git repository and I need to push my local git into existing svn repository. My git repository is pure local git repository, it was not init using git svn clone.
How can I import this local git repo into svn?
Preferably I'ld like to keep the git history being imported into SVN.
Currently the SVN repository is structure as:
https://svnrepohost
/branches
/tags
/trunk
/projectA
/projectB
/newProject
What I need it is to import my git repository into the https://svnrepohost/trunk/newProject above, assuming the newProject folder is empty.
I have finally solved this problem by the following steps:
Setup appropriate project folder in svn to be imported to, for example http://svnrepo/svn/trunk/newProject
Create a new git-svn repository
git svn clone http://svnrepo/svn/trunk/newProject
Add the git repo that we want to import as remote to the new git-svn repo
git remote add origin ../original-git-repo
Pull all the data from original-git-repo
git pull origin master --allow-unrelated-histories
Rebase local repository against svn
git svn rebase
Commit the changes into svn
git svn dcommit
Clean up the remote
git remote delete origin
The easiest way to do this is to just svn import the Git directory. That will lose you your Git commit history, however.
First of all, make sure the .git directory won't be imported by setting the global-ignores in the Subversion config file. Open your ~/.subversion/config file (that'll be in something like C:\Users\username\.subversion\config on Windows), find the section starting [miscellany], and add a line directly underneath reading as below:
global-ignores = .git
(if you already have a line with global-ignores = that doesn't have a # in front of it, then just add .git to the end of that line.)
Next, run the below:
svn import <path-to-local-git-repository> https://svnrepohost/trunk/newProject
That should copy the contents of the local Git repository onto the server exactly where you want it.
You may use SubGit.
$ svnadmin create repo.svn
$ subgit configure repo.svn
...
CONFIGURATION SUCCESSFUL
Adjust '/tmp/repo.svn/conf/subgit.conf' file
and then run
subgit install "repo.svn"
to complete SubGit installation.
$ nano repo.svn/conf/subgit.conf #edit to set git.default.repository=path/to/your/bare/git/repository
$ subgit install repo.svn
I would also recommend you to create a bare clone of your Git repository and to specify path to it (in git.default.repository) instead of your original repository. I.e.
$ git clone --bare path/to/your/original/repository path/to/your/bare/git/repository
After "subgit install" command the repositories (repo.svn and repo.git) will be in continuos synchronization (triggered by pre-receive hook in Git [that starts on pushing to your bare repository] and pre-commit in SVN). To stop synchronization you may run
$ subgit uninstall repo.svn
git svn clone http://svnrepo/svn/trunk/newProject
git remote add origin ../original-git-repo
git fetch origin
git checkout -b lmaster remotes/origin/master
git rebase master
git svn rebase
git svn dcommit

How to recreate a git svn remote tracking branch?

I'm using git as an interface to an SVN repository. Now I've created a SVN branch:
git svn branch my_branch
This created the directory in my SVN repository, and also created a branch called remotes/my_branch. Then I've deleted that remote tracking branch:
git branch -r -d my_branch
Now the directory is still there in the SVN repository, but I can't seem to find a way to get the remote tracking branch back. Any idea? I tried
git svn branch my_branch
=> branch test_new_mod_named already exists
and played around with git svn reset, etc. to no avail.
The easiest way I found to be making a commit in my_branch using svn, and then doing another git svn fetch.
$ git svn branch my_branch
Copying file:///Users/tfnico/svn-repo/website/trunk at
r14 to file:///Users/tfnico/svn-repo/website/branches/my_branch...
Remote branch is there:
$ git branch -a
master
* trunk
remotes/my_branch
Delete branch:
$ git branch -r -d my_branch
Deleted remote branch my_branch (was d422fbd).
And branch is gone. Now try a git svn fetch to recreate it:
$ git svn fetch
Nothing happens, until somebody does this...
$ svn checkout file:///Users/tfnico/svn-repo/website/branches/my_branch/
... and makes a commit. Voila:
$ git svn fetch
M hotfix.txt
r19 = f7449780fbb653cbcbc09861c0b446d41321e3f5 (refs/remotes/my_branch)
[17:29:33] tfnico:~/sources/git/website/[trunk]>git branch -a
master
* trunk
remotes/my_branch
Remote branch is back.

git svn status - showing changes that are not committed to svn

I'm looking for a command in git-svn that will show me the changes I have committed to my git repository but that aren't yet committed to the central svn repository. I'm looking for something that works like svn status, but I'm using git-svn, and unfortunately, git svn status is not a valid command.
I tried git status but it does not solve this problem, as it shows changes that haven't been committed to my local git repo.
I also tried git svn dcommit --dry-run, but it doesn't tell me which files are ready to be dcommitted - it only shows the repository URL.
Assuming the branch for the remote Subversion repository is at remotes/git-svn, run the following:
git svn fetch
The fetch will ensure that remotes/git-svn is up-to-date. (Thanks to Mark for pointing this out in a comment.)
git diff --name-status remotes/git-svn
This should show you the name and status of all the files that have been committed to git but not to Subversion, just like the svn status command.
In case you're not sure where the branch containing the Subversion remote repository is located, you can run:
git branch -a
which should produce output similar to the following:
* master
remotes/git-svn
You can probably guess from this that the remote Subversion repository is in remotes/git-svn.
You can also use
git diff git-svn HEAD -d
or if you have difftool specified:
git difftool git-svn HEAD -d