«

""


[Git] サブモジュールの更新メモ

最近は自分で苦労して調べたことをブログにメモしなくても
何度でもAIさんが根気よく同じことを嫌がらずに教えてくれるので
自分のブログメモが減ってしまいました…

しかしさすがに同じことを何回聞いてるねん!?となったので、メモしておきます

リポジトリ内にサブモジュールがあるときの更新方法メモです

手順

develop/build00 のサブモジュール “libs/XXX” のブランチ master を紐付けたいとする

既にサブモジュールブランチ XXX の master は更新済み & Push済みとします

develop/build00 がみんなの作業ブランチの場合、PR用のブランチ maintenance/update-submodule00 などを作って更新対象にする

# 作業前におかしな状態になってないかどうかを確認する
git status

# メインリポジトリのブランチをチェックアウト
git checkout develop/build00
git pull

# 目的のブランチに居てるよね?の確認
# (この場合develop/build00に居る)
git branch

# 念のためサブモジュールを更新
git submodule update --init --recursive

# PRのための新しいブランチを作成
git checkout -b maintenance/update-submodule00

# 今のブランチは maintenance/update-submodule00 のはず
git branch

# libs/XXX サブモジュールに移動
cd libs/XXX

# サブモジュールの目的のブランチをチェックアウト
git checkout master
git pull

# 目的のブランチに居てるよね?の確認
# (この場合masterに居る)
git branch

# メインリポジトリに戻る
cd ../..

# しつこいけど、今のブランチは maintenance/update-submodule00 のはず
git branch

# メインリポジトリでサブモジュールの新しい状態をcommit
git add libs/XXX
git commit -m "Update libs/XXX submodule"

# メインリポジトリの変更をプッシュ
git push origin maintenance/update-submodule00

# 最後に Github 上で maintenance/update-submodule00 から develop/build00 へPRを出す

こんな感じですね


[Git] コミット済みのファイルを Git LFS 管理対象にしたいとき

バイナリファイルコミットしちゃたけど、これ Git LFS 管理対象にしたかったよねー。。。

というときの作業メモです

わたしの環境は Windows での動作確認になります

1) git lfs installGit LFS をインストールします
わたしの環境にはすでに入っていたみたい…

>git lfs install
Updated Git hooks.
Git LFS initialized.

2) git lfs version でバージョンを確認しておく

>git lfs version
git-lfs/3.2.0 (GitHub; windows amd64; go 1.18.2)

3) git lfs track とすると、.gitattributes に格納されている対象データの情報が見れます

例えばこんな感じ

>git lfs track
Listing tracked patterns
    *.dll (.gitattributes)
    *.exe (.gitattributes)

4) git lfs track でLFS管理に入れたいファイルを指定します

>git lfs track "*.o"
Tracking "*.o"

ファイル単体を指定したければ、直接指定すればOK

>git lfs track "aaa/bbb/ccc.bin"

5) .gitattributes に追加した対象ファイルが記載されているので
それをコミット&プッシュすればOK!

6) まだLFS管理してなかったときにコミットしてしまったファイルは
いったん削除コミットをしてから、もう一度コミット&プッシュするのが良さそうでした


(参考リンク)


[Git] macでgitを初めて使う時

mac で初めてコマンドから git を使う時の設定メモです

git コマンドが使えなかった

Gitをコマンドラインで打つと、こんなエラーが出ました。。。

1
% git 

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

開発者ツールが入ってないらしい

Xcode をインストールする

xcode-select --install でインストールします

1
2
3
% xcode-select --install
code-select: note: install requested for command line developer tools
% 

こんな感じでインストールが進みます

実際のダウンロードは、わたしの環境では20分くらい、インストールは10分くらいでした

そしてインストール完了のウィンドウが出てほっ…

Gitコマンドが使えるように

git と打ってみる

1
% git                   

usage: git [–version] [–help] [-C ] [-c =]
[–exec-path[=]] [–html-path] [–man-path] [–info-path]
[-p | –paginate | -P | –no-pager] [–no-replace-objects] [–bare]
[–git-dir=] [–work-tree=] [–namespace=]
[]

無事、コマンドラインから git が使えるようになりました〜


[Git] フォーク元のリポジトリに追いつきたいときメモ

よくフォークしたリポジトリを最新化する方法を忘れては検索を繰り返してるので、いい加減自分のブログにメモしておきます

最初の fork 以降、フォーク元のリポジトリに追いつきたいときのお話です


1. 自分のローカルのリポジトリに登録されているリモート情報を見てみる

1
$ git remote -v

わたしの実行結果はこんな感じ、まだフォーク元との関連はなし

1
2
3
$ git remote -v
origin	https://github.com/h-sao/xxx.git (fetch)
origin	https://github.com/h-sao/xxx.git (push)

2. フォーク元のURLを upstream に登録します

(フォーク元は zzz/xxx という名前で公開されている場合です)

1
$ git remote add upstream https://github.com/zzz/xxx.git

ちゃんと登録されてるかどうかは、さっきの git remote -v で確認します

1
2
3
4
5
$ git remote -v
origin	https://github.com/h-sao/xxx.git (fetch)
origin	https://github.com/h-sao/xxx.git (push)
upstream	https://github.com/zzz/xxx.git (fetch)
upstream	https://github.com/zzz/xxx.git (push)

upstream にフォーク元が登録されていますね

<余談>

もし upstream の内容を間違って登録してしまったときは
$ git remote remove upstream
このコマンドで削除することができます

3. フォーク元リポジトリを fetch and mearge します

1
2
$ git fetch upstream
$ git merge upstream/master

<余談>

※ これ↑↑↑ は主流のブランチが master の場合。ものによっては main の場合もあるので確認が必要!
@qt_luigi さんからのコメント頂いたので、記事に追記しておきます~

ローカルのリポジトリ内容が、フォーク元と同じに最新化されました!


あとは別ブランチでプルリクエストを出すなりなんなりすればOK

ローカルの master はこのまま push しておくのも忘れずに♪

一度この作業をやっておくと、GitHub側に Fetch upstream というボタンが出てくるので、次からはこのボタンをポチッとするだけで↓↓↓

内容がフォーク元に追いつきます

便利ですね〜★

(参考)


[Git] Gitの歴史を書き換える関連

よくやらかすので自分メモ

事前準備

# 今いるブランチの確認
$ git branch

# ブランチに移動
$ git checkout feature/xxxxx

PR出す前、きれいな環境にしたいなどで整えておきたいこと

# 手動ブランチの取得/追従
$ git checkout feature/yyyyy
$ git pull

ローカル作業全てを無かったことにする

git fetch origin
git reset --hard origin/master

pushしてしまった歴史を書き換える

# 自分の名前のコミットを検索
$ git log --committer="Sao Haruka"

# ↑の gitlog より戻りたいハッシュ値を探す

$ git reset [戻りたいコミットのハッシュ値] --hard

# 強制push
$ git push -f origin feature/xxxxx

既に feature/xxxxx で誰かが作業していたら強制プッシュはあきらめる

不要になったブランチを削除する

要らないブランチは削除しとく

$ git push --delete origin feature/xxxxx

PRに不要なコミットが混じる

原因:

マージ先の最新を取っとくと大丈夫


[Git] Commit&PushしてしまったAuthor情報を変更したい

最近、GitKraken を使って更新をしています
Pro バージョンだとアカウント情報の切り替えが簡単に出来るので
会社用や個人用に切り替えて作業するのがとても便利です

しかしたまに切り替え忘れて、本来のアカウントじゃないやつでコミットしてしまって
意図しないメアドやユーザ名が入ったりして…(-“-;A …アセアセ

そんなときの変更の方法です

Author 変更方法

直前のコミットを変更したい場合です

$ git commit --amend

を使うと、コミット履歴が書き換えられるんですけど
これで書き換えると、コミットの作者(Author)は変わらず、コミッター(Commiter)が変わるだけです

Authorを書き換えるには

$ git commit --amend --author="Sao Haruka <sao@tmp.com>"

こうすると書き換わります
こんな感じね↓↓↓

1
2
3
4
$ git commit --amend --author="Sao Haruka <sao@tmp.com>"
[feature/xxxxx 9999999999] [WIP] Added hogehoge
 Date: Thu Oct 10 22:30:00 2019 +0900
 1 files changed, 1 insertions(+), 1 deletions(-)

書き換わったー!

サーバーに push しちゃってるとき

もし自分だけの作業ブランチでやってるのであれば、サーバーの履歴を強制的に書き換えることが出来ます
(共通ブランチでは、強制書き換えはやめよう)

$ git push -f [repository] [branch]

恐る恐るやってみる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# まずは強制オプションをつけずにやってみる(もちろんエラー)

$ git push origin feature/xxxxx
To tmp.com:ohoho/hoge.git
 ! [rejected]              feature/xxxxx -> feature/xxxxx (non-fast-forward)
error: failed to push some refs to 'tmp.com:ohoho/hoge.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

# 強制オプションをつけてpush

$ git push -f origin feature/xxxxx
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Delta compression using up to 1 threads
Compressing objects: 100% (1/1), done.
Writing objects: 100% (1/1), 1 KiB | 1 MiB/s, done.
Total 1 (delta 1), reused 0 (delta 0)

事なきを得た(_・ω・)_バァン…

参考:


[Git] Visual Studio 2019の中のGitコマンドを探せ!

Gitクライアント…

自然に入ってますよね、わざわざ入れなくても。。。( *´艸`)

Visual Studio 2019 が入ってる環境だったので、Gitクライアントくらいあるじゃろーと思って、検索してみたらありました!

わたしの場合の環境は、ここ↓↓↓

C:\Program Files (x86)
 \Microsoft Visual Studio
  \2019
   \Enterprise
    \Common7
     \IDE
      \CommonExtensions
       \Microsoft
        \TeamFoundation
         \Team Explorer
          \Git
           \cmd
            \git.exe

C:\dev>"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\cmd\git.exe" --version
git version 2.21.0.windows.1

C:\dev>

バージョンもそこそこ新しいです!

パス長いけど、これ使うか~( ^^) _旦~~


[SSH] ポート指定GitサーバにSSHでアクセスできない時(Windows/GitExtensions)

最近…

機械学習関係をやってたんですけど、Unityをまた触ることになっています
てんやわんやして、前回更新から2カ月も経ってしまった…(+o+)

今回また、タイトル名のGit/SSH関係でオロオロしたので、同現象で困ってる人の助けになれば幸いです

(現象)初回SSH接続に失敗する

環境

こんな環境で作業していました(古いPCからアクセスしたかったので、Win7なのです…)

  1. 初回クローンするために、Gitサーバにアクセスしようと、秘密鍵を .ssh ディレクトリ以下にコピーしておきます
    デフォルトのSSH秘密鍵置き場は
    c:\Users[ユーザ名].ssh/id_rsa
    です

  2. GitExtensionsを利用してGitリポジトリからクローンしようとすると、以下のエラーが…

fatal: Could not read from remote repository.
Please make sure you have the correct access rights and repository exists.

え、なんで…?

(解決)ポート番号ありでknown_hostsに登録する

アドレスも合ってる!
リポジトリもある!
サーバには公開鍵、クライアントには秘密鍵を置いてる!

これでなぜアクセス出来ないのか、解明に半日かかってしまいました…トホホ
自分のインフラ力の無さに涙が出そうです

答えを書きますと、

これで解決しました…(^_^;)

わたしの場合のポイントは、ポート指定でした


  1. コマンドプロンプトを立ち上げます
    わたしの場合、GitExtensionsを使ってたので Tools > Git bash から立ち上げました

  2. SSH のテスト接続を行います

$ssh git@[サーバアドレス] -p [SSHアクセスのポート番号]

そしたら、

Are you sure you want to continue connecting (yes/no)?

と聞かれるので、すかさず yes を!
c:\Users[ユーザ名].ssh\known_hosts にアクセス情報が登録されます

これで GitExtensions に戻って新規クローン開始したら、拒否されることなくソースを取得できました!

まとめ

最初に、

$ssh git@[サーバアドレス]

この状態で接続テストしてたんですけど、足りてないみたいでした

たったこれだけなんですけど、あまり情報が乗ってなかったように思いますので
未来の自分へのメモ…


[SSH] 複数キー接続のconfig記載について

前回、
[Git] Gitで利用するsshキーペアの作成、ssh接続、複数ID接続
で Gitサーバにアクセスするための ssh 接続について記載しました

その追記メモです

.\.ssh\config ファイルに記載する内容

Git アクセス に ssh を利用する際に、複数アカウントを利用したい
つまり、複数 ssh キーを利用したい
という場合についてです

もし、利用するキーの名前が id_rsa であれば
これはデフォルトで認識される名前なので、わざわざ .\.ssh\config ファイルに記載しなくても接続OK
でした

つまり例えば、

  1. 元々 社内用 Git サーバのアクセスに id_rsa を利用していた
  2. 追加で、GitHub にアクセスするキー(github_rsa など別名称)を作成した

こんな場合があったとします

.\.ssh\config ファイルに記載する内容は 2. の github_rsa のものだけでOKです

もちろん、 1. の id_rsa を書いても問題ないですし、コンフィグにちゃんと記載されている方が、後々判りやすいと思いますが
無理に config に追記しなくてもわたしの環境では問題なく接続できました

参考までに~(^^)/


[Git] Gitで利用するsshキーペアの作成、ssh接続、複数ID接続

しょっちゅう作っては、作り方を忘れ、また検索で調べる…ということをしているので、sshキーの生成&接続について、忘れないようにメモしておきます

GitサーバへSSHキーを使って接続したい

Gitサーバに接続するには、

この2種類の接続方法があるみたいです

Git接続用のクライアントアプリは、どっちで接続するか選択できるものもあるので
Sourcetreeなどを使っていると、あまり認識してない人もいるかもしれません

今回、こんなクライアント環境で試しました

これを試そうと思ったモチベーションは、push のたびに IDとパスワードを毎回聞かれるのがやだ、だからキーペアを利用して ssh アクセスにするんだー
というところから始まってます

GitHub のIDとパスワードをスキップして、セキュアアクセスするのだ!という方の参考になればと思います!

あと、番外編として、 非推奨ですが https アクセスでIDとパスワードを毎回聞かれないようにする方法も最後にメモしておきます

キーの生成方法 ssh-keygen

ここは普通に
公開鍵と秘密鍵を作ればいいだけなので、知ってる人に取ったら何をいまさら…になりますが、一応メモ

Gitがインストールされているなら ssh-keygen が使えますので、コマンドを打つだけ
(コマンドを打たなくても、Gitのクライアントアプリが勝手にやってくれる場合もあります)

GitBash などを起動します

コマンドはこちら

$ ssh-keygen -t rsa

基本的には、何か聞かれてもエンターで進めばOKです

デフォルトでは c:\Users\[ユーザ名]\.ssh\** 以下に秘密鍵(id_rsa)公開鍵(id_rsa.pub)**のキーペアが作成されます

Windowsだとキーの保存位置は c:\Users\[ユーザ名]\.ssh\ にしないといけません

わたしは、Github用のキーだと判るように、名前を github_rsa として作成しました
(既に別の用途で id_rsa を使っているからです、つまり複数アカウントを利用しています)

実行結果はこれ↓↓↓

(SHA256以下の箇所は、適当に x で書き換えています) haruka.sao@MyPC MINGW64 ~ $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/haruka.sao/.ssh/id_rsa): /c/Users/haruka.sao/.ssh/github_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/haruka.sao/.ssh/github_rsa. Your public key has been saved in /c/Users/haruka.sao/.ssh/github_rsa.pub. The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx haruka.sao@MyPC The key's randomart image is: +---[RSA 2048]----+ | x | | x | | x | | x | | x | | x | | x | | x | | x | +----[SHA256]-----+ haruka.sao@MyPC MINGW64 ~ $

キーペアができたできた

SSHキーをGitHubに登録

c:\Users\[ユーザ名]\.ssh\ に保存された id_rsa.pub (わたしの場合はgithub_rsa.pub)を GitHubに登録します

自分のアカウントの Settings > SSH and GPG keys > New SSH key をクリックすると、先ほど作った公開鍵を登録することができます

先ほど作った id_rsa.pub 公開鍵を登録しましょう!
くれぐれも id_rsa の秘密鍵の方ではないので、お間違え無く!

id_rsa.pub の中身を見ればわかりますが、「ssh-rsa ……」 から始まっているファイルになります

登録すると、こんな感じの記載になります

最後に、自分の秘密鍵が c:\Users\[ユーザ名]\.ssh\ に設置されていることを再確認!

OpenSSH モード

GitExtensions で ssh 接続したい場合、
私的にはお勧めなのは、OpenSSHモードにすることです

※ PuTTYアクセスは、PuTTYの独自フォーマットのキーを登録するなどが必要ですので、わたしは利用をやめました

これで下準備はOK!

PCから ssh で接続テスト

Git bash で接続テストしてみましょう

さっきの Git bash で、リポジトリの下まで移動します
もしくは、GitExtensions から起動すると、初期ディレクトリはそのリポジトリの下になります

確認パターンは2パターンあります

(パターン1) id_rsa で登録している ssh キーを利用する場合

このコマンドで確認します

1
$ ssh -T git@github.com

id_rsa というファイル名を、ssh 接続では自動的に認識するようです

初回は、known_hosts に GitHub サーバを登録するよ?と聞いてくるので、 yes を入力します

Hi [GitHubユーザ名]! You’ve successfully authenticated, but GitHub does not provide shell access.

が表示されればOKです

わたしの実行結果はこちら↓↓↓

$ ssh -T git@github.com The authenticity of host 'github.com (192.30.252.122)' can't be established. RSA key fingerprint is xx:xx:xx:xx:xx:xx: Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,192.30.252.122' (RSA) to the list of known hosts. Hi h-sao! You've successfully authenticated, but GitHub does not provide shell access.

known_hosts ファイルがこんな感じで作られました

(パターン2) 独自の名前で作った ssh キーを利用する場合

わたしの場合は、先ほど github_rsa という名前でキーを生成したので、こちらのパターンになりました

まず、 github_rsa という独自名称を ssh アクセス時に認識させる必要があります

c:\Users\[ユーザ名]\.ssh\ 直下に config という名前のファイルを作成します

※この部分は、Gitうんぬんは関係のない、ssh 接続の話です
 Windows の ssh 接続では c:\Users\[ユーザ名]\.ssh\config はすべてのSSH接続で共有されます

c:\Users\[ユーザ名]\.ssh\config の内容はこんな感じです

Host my.github.server HostName github.com Port 22 User h-sao IdentityFile ~/.ssh/github_rsa TCPKeepAlive yes IdentitiesOnly yes

<参考リンク>

ここまで準備したら、接続テストしましょう
config に設定した名前で Host の名称アクセスすることが出来ます!

1
$ ssh -T my.github.server

うまくいくと、パターン1と同じように、known hostに登録するかどうかを聞かれて、ファイルが作成されます

また、

Hi [GitHubユーザ名]! You’ve successfully authenticated, but GitHub does not provide shell access.

こんな感じで、自分のGitHub名でアクセス出来たことが判ります
いちおキャプチャ置いときます

これで、クライアントPCから GitHub に IDとパスワードを利用せずに接続することが出来ました!

まだGitExtensions から ssh アクセスは出来ない

さて、この状態で、GitExtensions のプッシュボタンを押して Pushしようとしても、IDとパスワードを聞かれます

Pushボタンを押すと…

GitHub のアカウントとパスワードを聞かれます…
どうやら https アクセスがデフォルトみたいです

ちゃんと自身の Git リポジトリに ssh 接続するんだよー

を認識させてあげないといけません

Git リポジトリに ssh 接続設定を教える

Git リポジトリの設定を Git bash のコマンドで見ることが出来ます

$ git config -l

これらの設定は、Git リポジトリ直下にある .\.git\ 以下にあります

この下の config ファイルなどを直接編集しても反映されますが、コマンドを使った方が良いでしょう

わたしの場合の実行結果はこちら

haruk@MACBOOKPROAKIKO ~/xxx (master) $ git config -l core.symlinks=false core.autocrlf=true color.diff=auto color.status=auto color.branch=auto color.interactive=true pack.packsizelimit=2g help.format=html http.sslcainfo=/bin/curl-ca-bundle.crt sendemail.smtpserver=/bin/msmtp.exe diff.astextplain.textconv=astextplain rebase.autosquash=true user.name=Sao Haruka user.email=xxx@yyy.tmp.com core.autocrlf=True core.excludesfile=C:\Users\haruk\Documents\gitignore_global.txt core.editor="C:/utils/GitExtensions/GitExtensions.exe" fileeditor merge.tool=kdiff3 diff.guitool=kdiff3 difftool.kdiff3.path=C:/utils/KDiff3/kdiff3.exe mergetool.kdiff3.path=C:/utils/KDiff3/kdiff3.exe core.repositoryformatversion=0 core.filemode=false core.bare=false core.logallrefupdates=true core.symlinks=false core.ignorecase=true core.hidedotfiles=dotGitOnly remote.origin.url=https://github.com/h-sao/xxx.git remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* branch.master.remote=origin branch.master.merge=refs/heads/master

上記の「remote.origin.url」が Git サーバにアクセスするときの URL になるので、これを ssh でアクセスするように変更します

デフォルトの id_rsa を利用するときは

git@github.com:[ユーザID]/[リポジトリ].git

を設定します

1
$ git remote set-url origin git@github.com:h-sao/xxx.git

id_rsa じゃない、別名の ssh キーファイルを利用するときの設定は

[Host名]:[ユーザID]/[リポジトリ].git

になります

1
$ git remote set-url origin my.github.server:h-sao/xxx.git

GitExtensions で Push してみましょう

URL の表記がちょっと変わりましたね
無事、IDとパスワードを聞かれることなく、プッシュが成功しているはずです\(^o^)/

やったー

<参考リンク>

(番外編) httpsアクセスでIDとパスワードを聞かれないようにする

ええ、今回、本当に色々と試しましたとも…

ssh ではなく https アクセスで、毎回アカウント情報を入力しない方法も調べました

あまりセキュアじゃないので、お勧めできませんが
一応記載しておきます

$ git config -l 

で調べた 「remote.origin.url」 の初期の記載はこれでした

remote.origin.url=https://github.com/h-sao/xxx.git

この https アクセスの URL 中に、IDとパスワードを埋め込めばOKです

https://[ユーザID]:[パスワード]github.com/h-sao/xxx.git

やってみたけど、パスワードが丸々画面に表示されるので、よくないです…
確かに、ssh キーファイルなど用意しなくてもいいので、便利ではありますが…><;

利用は自己責任でお願いします

<参考リンク>

追記記事書きました(2016/5/9)