1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
#+date: [2021-03-19 Fri 00:00:00]
#+title: Scripting Mass Clones from GitHub and Sourcehut
#+description: Scripts to clone all your repos from GitHub or Sourcehut at once.
#+slug: clone-github-repos
#+filetags: :personal:
* Cloning from GitHub
If you're like me and use a lot of different devices [and sometimes decide to
just wipe your device and start with a new operating system (OS)], you probably know
the pain of cloning all your old code repositories down to your local file
system.
If you're using GitHub, you can easily clone all of your code back down in just
seconds. First, create a bash script. I do so by opening a new file in =nano=,
but you can use =gedit=, =vim=, or something else:
#+begin_src sh
nano clone_github_repos.sh
#+end_src
Next, paste in the following information. Note that you can replace the
word =users= in the first line with =orgs= and type an organization's
name instead of a user's name.
#+begin_src sh
CNTX=users; NAME=YOUR-USERNAME; PAGE=1
curl "https://api.github.com/$CNTX/$NAME/repos?page=$PAGE&per_page=100" |
grep -e 'git_url*' |
cut -d " -f 4 |
xargs -L1 git clone
#+end_src
Finally, save the bash script and make it executable.
#+begin_src sh
chmod a+x clone_github_repos.sh
#+end_src
Now you can run the script and should see the cloning process begin.
#+begin_src sh
./clone_github_repos.sh
#+end_src
* Cloning from Sourcehut
I haven't fully figured out how to directly incorporate Sourcehut's GraphQL
application programming interface (API) into a bash script yet, so this one will
take two steps.
First, log-in to Sourcehut and go to their [[https://git.sr.ht/graphql][GraphQL playground for Git]]. Next,
paste the following query into the left box:
#+begin_src sh
query {
me {
canonicalName
repositories() {
cursor
results {
name
}
}
}
}
#+end_src
The output on the right side will give you an object of all your repositories.
Just grab that text and remove all the characters such as quotation marks and
curly brackets. You will need a single-line list of space-separated values for
the next step.
Now let's create the bash script:
#+begin_src sh
nano clone_sourcehut_repos.sh
#+end_src
Next, paste the following bash script in with the list of repositories you
obtained above and replace =your-username= with your username.
Note that this uses the secure shell protocol (SSH)-based Git cloning method
(e.g. =git@git...=), so you'll need to ensure you have set up Sourcehut with
your SSH key.
#+begin_src sh
repos=(repo1 repo2 repo3)
# List all sub-directories in the current directory
for repo in "${repos[@]}"
do
# Clone
git clone [email protected]:~your-username/$repo
done
#+end_src
Finally, save the bash script and make it executable.
#+begin_src sh
chmod a+x clone_sourcehut_repos.sh
#+end_src
Now you can run the script and should see the cloning process begin.
#+begin_src sh
./clone_sourcehut_repos.sh
#+end_src
* Moving Repositories to a New Host
Now that you have all of your code repositories cloned to your local computer,
you may want to change the remote host (e.g., moving from GitHub to GitLab). To
do this, let's create another bash script:
#+begin_src sh
nano change_remote_urls.sh
#+end_src
Paste the following information and be sure to change the URL (uniform resource
locator) information to whichever host you are moving to. For this example, I am
looping through all of my cloned GitHub directories and changing them to
Sourcehut (e.g. =<YOUR_NEW_REMOTE_URL>= -> [email protected]:~myusername=).
#+begin_src sh
# List all sub-directories in the current directory
for dir in */
do
# Remove the trailing "/"
dir=${dir%*/}
# Enter sub-directory
cd $dir
# Change remote Git URL
git remote set-url origin <YOUR_NEW_REMOTE_URL>/"${dir##*/}"
# Push code to new remote
git push
# Go back to main directory
cd ..
done
#+end_src
Finally, save the bash script and make it executable.
#+begin_src sh
chmod a+x change_remote_urls.sh
#+end_src
Now you can run the script and should see the cloning process begin.
#+begin_src sh
./change_remote_urls.sh
#+end_src
|