GitHubおよびGitLabリポジトリのクローン作成と管理のためのBashワンライナーの作成方法
何時間もの面倒な作業を自動化するBashの1つのエレガントなラインほど、私にとって満足できるものはほとんどありません。
Bashスクリプトを使用してラップトップを自動的に再作成する最近の調査の一環として(投稿予定!)、GitHubでホストされているリポジトリを新しいマシンに簡単に複製する方法を見つけたいと思いました。少し掘り下げた後、私はまさにそれを行うワンライナーを書きました。
次に、すべての卵を同じバスケットに入れないという精神で、GitLabがホストするバックアップも自動的に作成してプッシュする別のワンライナーを作成しました。ここにあります。
警告:クローンを作成するGitHubリポジトリのリストが必要になります。それの良いところは、完全な代理店ではなく、マシン上で必要なリポジトリだけを選択できることです。
15分のキャッシュされたクレデンシャルでHTTPSを使用するか、SSHでGitHubに接続することで、毎回パスワードを入力せずにGitHubリポジトリのクローンを簡単に作成できます。簡潔にするために、後者を使用し、SSHキーが設定されていると仮定します。
ファイルgh-repos.txt
内のGitHubURLのリストを指定します 、このように:
[email protected]:username/first-repository.git
[email protected]:username/second-repository.git
[email protected]:username/third-repository.git
実行します:
xargs -n1 git clone < gh-repos.txt
これにより、リスト上のすべてのリポジトリが現在のフォルダに複製されます。適切なURLに置き換えると、これと同じワンライナーがGitLabでも機能します。
ここで何が起こっているのですか?
このワンライナーには2つの半分があります。右側にある入力と、何かを起こさせる部分です。次のように同じコマンドを書くことで、これらの部分の順序をより直感的にすることができます(多分?):
<gh-repos.txt xargs -n1 git clone
入力の各行に対してコマンドを実行するには、 gh-repos.txt
、 xargs -n1
を使用します 。ツールxargs
入力からアイテムを読み取り、見つかったコマンドを実行します( echo
見つからない場合)。デフォルトでは、アイテムはスペースで区切られていると想定しています。新しい行も機能し、リストが読みやすくなります。フラグ-n1
xargs
に通知します 1
を使用するには 引数、またはこの場合はコマンドごとに1行。 git clone
を使用してコマンドを作成します 、 xargs
次に、各行に対して実行されます。タダ。
GitLabで多くのリポジトリを作成してプッシュするためのBashワンライナー
GitLabは、GitHubとは異なり、最初に新しいリポジトリを作成するためにWebサイトを使用する必要がないこの気の利いたことを可能にします。ターミナルから新しいGitLabリポジトリを作成できます。新しく作成されたリポジトリはデフォルトでプライベートとして設定されているため、GitLabでパブリックにする場合は、後で手動で行う必要があります。
GitLabのドキュメントでは、 git push --set-upstream
を使用して新しいプロジェクトを作成するようにプッシュするように指示されています 、しかし、これがGitLabをバックアップとして使用するのに非常に便利だとは思いません。将来、リポジトリを操作するときに、GitHubとの両方にプッシュする1つのコマンドを実行したいと思います。 私の側で追加の努力をしなくてもGitLab。
このBashワンライナーを機能させるには、GitLabのリポジトリURL(まだ存在しないもの)のリストも必要です。これは、GitHubリポジトリリストをコピーしてVimで開き、検索と置換を行うことで簡単に実行できます。
cp gh-repos.txt gl-repos.txt
vim gl-repos.txt
:%s/\<github\>/gitlab/g
:wq
これにより、 gl-repos.txt
が生成されます 、次のようになります:
[email protected]:username/first-repository.git
[email protected]:username/second-repository.git
[email protected]:username/third-repository.git
GitLabでこれらのリポジトリを作成し、URLをリモートとして追加し、次のコマンドを実行してコードを新しいリポジトリにプッシュできます。
awk -F'\/|(\.git)' '{system("cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push")}' gl-repos.txt
しばらくお待ちください。説明します。今のところ、〜/ FULL / PATH /
に注意してください GitHubリポジトリを含むディレクトリへのフルパスである必要があります。
いくつかの仮定に注意する必要があります:
- リポジトリを含むローカルマシン上のディレクトリの名前は、URL内のリポジトリの名前と同じです(これは、上記のワンライナーで複製された場合に当てはまります)。
- 各リポジトリは現在、プッシュするブランチにチェックアウトされています。
マスターコード> 。
ワンライナーはこれらの仮定を処理するために拡張できますが、その時点で、Bashスクリプトを作成する必要があるというのは著者の謙虚な意見です。
ここで何が起こっているのですか?
Bashワンライナーはgl-repos.txt
の各行(またはURL)を使用します 入力としてのファイル。 awk
を使用 、ローカルマシン上のリポジトリを含むディレクトリの名前を分割し、これらの情報を使用してより大きなコマンドを作成します。 print
の場合 awk
の出力 、次のように表示されます:
cd ~/FULL/PATH/first-repository && git remote set-url origin --add [email protected]:username/first-repository.git && git push
cd ~/FULL/PATH/second-repository && git remote set-url origin --add [email protected]:username/second-repository.git && git push
cd ~/FULL/PATH/third-repository && git remote set-url origin --add [email protected]:username/third-repository.git && git push
このコマンドを作成する方法を見てみましょう。
awk
で文字列を分割する
ツールawk
フィールドセパレータに基づいて入力を分割できます。デフォルトの区切り文字は空白文字ですが、 -F
を渡すことでこれを変更できます 国旗。 1文字のほかに、正規表現のフィールド区切り文字を使用することもできます。リポジトリのURLには設定された形式があるため、スラッシュ文字 /
の間の部分文字列を要求することでリポジトリ名を取得できます。 URLの末尾.git
。
これを実現する1つの方法は、正規表現 \ / |(\。git)
を使用することです。 :
-
\ /
エスケープされた/
です 文字; -
|
「または」を意味し、awkにどちらかの式に一致するように指示します。 -
(\。git)
URLの最後にあるキャプチャグループで、「。git」と一致し、をエスケープします。
キャラクター。 「.git」は厳密には何も分割していないため(反対側には何もありません)、これはちょっとしたごまかしですが、このビットを簡単に取り除くことができます。
awk
に伝えたら 分割する場所では、フィールド演算子を使用して正しい部分文字列を取得できます。 $
でフィールドを参照します 文字、次にフィールドの列番号。この例では、2番目のフィールド $ 2
が必要です。 。すべての部分文字列は次のようになります。
1: [email protected]:username
2: first-repository
文字列全体、この場合はURL全体を使用するには、フィールド演算子 $ 0
を使用します。 。コマンドを作成するには、リポジトリ名とURLの代わりにフィールド演算子を使用します。 print
でこれを実行する 構築中は、すべてのスペースが適切であることを確認するのに役立ちます。
awk -F'\/|(\.git)' '{print "cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push"}' gl-repos.txt
system()
の括弧内にコマンドを作成します 。これをawk
の出力として使用する 、各コマンドは、ビルドおよび出力されるとすぐに実行されます。 system()
functionは、コマンドを実行する子プロセスを作成し、コマンドが完了すると戻ります。平易な英語では、これにより、 awk
のメインプロセスを中断することなく、各リポジトリでGitコマンドを1つずつ実行できます。 入力ファイルで処理を行っています。これが最後のコマンドです。すべてまとめました。
awk -F'\/|(\.git)' '{system("cd ~/FULL/PATH/" $2 " && git remote set-url origin --add " $0 " && git push")}' gl-repos.txt
GitLab URLをリモートとして追加することで、外部でホストされている両方のリポジトリにプッシュするプロセスを簡素化しました。 git remote -v
を実行すると リポジトリディレクトリの1つに、次のように表示されます。
origin [email protected]:username/first-repository.git (fetch)
origin [email protected]:username/first-repository.git (push)
origin [email protected]:username/first-repository.git (push)
ここで、 git push
を実行するだけです。 引数がないと、現在のブランチが両方のリモートリポジトリにプッシュされます。
git pull
にも注意する必要があります 通常、最初にクローンを作成したリモートリポジトリ((fetch)
とマークされたURL)からのみプルを試みます。 上記の例では)。複数のGitリポジトリから同時にプルすることは可能ですが、複雑であり、この投稿の範囲を超えています。興味がある場合は、開始するのに役立つ複数のリモートへのプッシュとプルの説明を次に示します。リモコンに関するGitのドキュメントも役立つ場合があります。
Bashワンライナーの簡潔さについて詳しく説明する
Bashワンライナーは、理解すると、楽しくて便利なショートカットになります。少なくとも、 xargs
のようなツールに注意してください。 およびawk
私たちの仕事の多くの面倒な作業を自動化して軽減するのに役立ちます。ただし、いくつかの欠点があります。
理解しやすく、保守しやすく、親しみやすいツールという点では、Bashのワンライナーは最悪です。通常、 if
を使用するBashスクリプトよりも作成が複雑です。 またはwhile
ループ、そして確かに読むのがより複雑です。それらを書くとき、どこかで一重引用符または閉じ括弧を見逃す可能性があります。そして、この投稿が示すように、彼らもかなりの説明をすることができます。では、なぜそれらを使用するのですか?
ケーキを焼くためのレシピを段階的に読んでいると想像してみてください。あなたは方法と材料を理解し、あなたの物資を集めます。そして、考えてみると、すべての材料を正しい順序でオーブンに入れるだけで、ケーキがすぐに実体化することに気づき始めます。あなたはそれを試してみて、それはうまくいきます!
それはかなり満足のいくものでしょうね
-
LinuxターミナルプロンプトでBashの色とコンテンツをカスタマイズする方法
現在、Bashは、ほとんどの(すべてではないにしても)最新のLinuxディストリビューションのデフォルトのシェルです。ただし、ターミナルのテキストの色とプロンプトの内容がディストリビューションごとに異なる場合があることに気付いたかもしれません。 推奨される読み物: Linuxで最も頻繁に使用される5つのオープンソースシェル アクセシビリティを向上させるため、または単なる気まぐれのためにこれをカスタマイズする方法を知りたい場合は、読み続けてください。この記事では、その方法について説明します。 PS1Bash環境変数 コマンドプロンプトと端末の外観は、PS1と呼ばれる環境変数によって制御
-
カスタムシェル関数とライブラリを作成して使用する方法
Linuxでは、シェルスクリプトは、特定のシステム管理タスクの実行や自動化、簡単なコマンドラインツールの作成など、さまざまな方法で役立ちます。 このガイドでは、新しいLinuxユーザーに、カスタムシェルスクリプトを確実に保存する場所、カスタムシェル関数とライブラリの記述方法、他のスクリプトでライブラリの関数を使用する方法を示します。 シェルスクリプトを保存する場所 フルパス/絶対パスを入力せずにスクリプトを実行するには、スクリプトを $ PATHのディレクトリの1つに保存する必要があります。 環境変数。 $ PATHを確認するには 、以下のコマンドを発行します: $ echo $PAT