My dotfiles. Period.

sibling 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/bin/sh
  2. #
  3. # Take first subdir (or a subdir specified in a file) and consider
  4. # it a git repo dir. Get its origin, exchange the last bit for
  5. # other project name and clone the other repo
  6. #
  7. # This is useful if you have a local dir where you store repos
  8. # for various projects from a common namespace that differ only
  9. # in last part of the remote URI. Now all you need to do to
  10. # clone new one is "git sibling aproject". The script will
  11. # do the rest for you including sniffing the URI.
  12. #
  13. # The script simply takes the first subdir. In case this is not
  14. # OK for you (e.g. the dir id likely to be empty or contain
  15. # come "non-compliant" repos, you can specify path to the
  16. # other "template" repo in .gittum-sibling file.
  17. #
  18. # Hint: regarding the "template" repo, you can easily create
  19. # a "fake" repo that would sit elsewhere, e.g.:
  20. # $ mkdir .some/hidden/dir
  21. # $ cd .some/hidden/dir
  22. # $ git init
  23. # $ git remote add origin ssh://our_server/projects/FAKE
  24. ## cfgz
  25. #
  26. origin_name="origin"
  27. sibling_conf=".gittum-sibling"
  28. ## funz
  29. #
  30. rewrite_uri_to () {
  31. # create a new remote URI based on current one
  32. git remote -v \
  33. | grep "^$origin_name" \
  34. | grep "(fetch)$" \
  35. | cut -f 2 \
  36. | cut -d" " -f 1 \
  37. | perl -pe "s|[^/]+$|$1|;"
  38. }
  39. ## initz
  40. #
  41. project=$1
  42. if [ -f $sibling_conf ];
  43. then
  44. sibling=$(cat $sibling_conf);
  45. else
  46. sibling=$(find -maxdepth 1 -type d -name "[^.]*" | sort | head -1)
  47. fi
  48. if [ -z "$sibling" ];
  49. then
  50. echo "could not find older sibling" 1>&2
  51. exit 1
  52. fi
  53. ## body
  54. #
  55. pushd "$sibling" >/dev/null
  56. new_remote=$(rewrite_uri_to $project)
  57. popd >/dev/null
  58. echo \'git clone $new_remote\'
  59. git clone $new_remote