How do I keep an svn:external up to date using git-svn?
Solution 1
The solution I ended up using was just to symlink to other git-svn
clones on my local box. This worked pretty well: it allows me to commit changes back, and it allows me to make local changes on project A just to get them into project B.
Solution 2
The best means of integrating svn externals with git-svn that I've seen is this script, which clones your externals into a .git_externals/ directory and creates the symlinks and exclude files you need. I find this a simple and direct solution. YMMV.
Here is an older overview of other options for dealing with svn externals with git-svn. To me they look a little over-complicated and liable to break under subsequent Git use.
Solution 3
I just wrote a short script which checkouts all svn:externals
of the current HEAD
to the root directory and excludes them from the git repository.
Place it to .git/hooks/post-checkout
and it will keep those external checkouts up to date whenever the working tree changes, for example due to git svn rebase
or git-checkout
.
#!/bin/bash
set -eu
revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
while read checkout_args
do
checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
svn checkout ${checkout_args}
if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
then
echo ${checkout_dirname} >> .git/info/exclude
fi
done
}
Solution 4
I also made a script (both Perl and Ruby variants available) that does this for me, it's at http://github.com/liyanage/git-tools/.
- Recursively checks out all svn:externals
- Can be run repeatedly in case the clone of a large repository aborts halfway through. Happened to me a lot. It picks up where it left off.
- Adds all svn:externals entries it finds and processes to .git/info/exclude
- Adds all svn:ignore entries it encounters to .git/info/exclude
- Can be run regularly after the first run to do the svn:rebase in all cloned sub-sandboxes, discover new externals and new svn:ignores
Update: I am no longer maintaining this script. Its functionality for recursively cloning and updating an SVN repository, as well as other git-related features, is available in this newer project that I am actively maintaining: http://liyanage.github.com/git-tools/
Solution 5
Just for the record: I followed this suggestion and tried using SmartGit for dealing with svn:externals
.
SmartGit is by far the best GUI client I've ever seen for Git. Regarding svn:externals
, it not only correctly fetches them, but also presents the option of doing a "fast snapshot" (read-only, HEAD-only clone) of external repositories.
Unfortunately it is not free for commercial use (and I found the license price a little bit too high - yes I'm a cheapskate). It may be used for free for non-commercial purposes though.
James A. Rosen
Updated on November 14, 2020Comments
-
James A. Rosen over 3 years
Treating my repository as a SVN repo, I get:
svn co http://myrepo/foo/trunk foo ... foo/ bar/ baz/ -> http://myrepo/baz/trunk
Treating it as a Git repo, I get:
git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags ... foo/ bar/
I can clone baz to my local machine elsewhere and add a symlink, but that's just a hack. Is there a way to have
git svn rebase
automatically pull in those changes when it updates everything else, just likesvn up
does? -
Marc Liyanage almost 14 yearsI'd like to learn what didn't work for you so I can improve the script. Can you contact me?
-
Paŭlo Ebermann over 12 yearsThis seems not to work for me (here the externals are relative links to the same repository).
-
axk about 12 yearsThere's a lot of forks. Does anyone know which one of them works on windows with msysgit? The linked version just hangs.
-
Bibek Shrestha over 11 yearsWhich folder would you run this against? If my main svn repository is /path/to/repo and the externals are defined inside /path/to/repo/myexternals/folder/ then should I run the script inside /path/to/repo or myexternals/folder?
-
pms1969 over 10 years+1 for something that almost works on windows git. I had to tweak it a little bit, but it's the best solution on here for windows.
-
Carl over 10 years@pms1969: Source for the tweaked version?
-
Plouff almost 8 yearsCouldn't make it work either. The documentation seems out of sync.
gh clone-externals
is not recognized as a valid subcommand.