up::

subtree

【手順】git subtreeコマンドの使い方 - Qiita
Git Subtree 事始め - Qiita
消すときはディレクトリさえ消せばいい。コミットは残るが。

説明

サブリポジトリをメインリポジトリのブランチとして取り込むやり方。サブのhistoryがメインのhistoryに一緒に載る。
ちなみに最初のsubtreeで--squashしないと、メインhistoryにサブのこれまでのhistoryが一気に全部載る。squash推奨。

サブの変更をメインに反映するには、git subtree pushすればいい。これでサブのリモートに変更を反映できる。サブのローカルを更新するときはgit subtree pull。メインとサブは直接くっついているので、サブのローカルが更新されるとメインのローカルも更新される。この二つも--squashしないとhistoryが全部載るので注意。

注意点として、実はこのコマンドはgit merge -s subtreeで指定できるmergeのオプション、subtreeのラッパー。その関係上リモートにその操作のログは残らないため、メインをcloneした際にどれがsubtreeなのかという情報は消滅する。前述のとおりサブのhistoryはメインに残るためファイルを扱うだけなら問題は無いが、同じように作業したいならgit subtree addを使用してリンクしなおす必要がある。

mergeなので、メインからサブのhistoryだけ示すことは出来ない。

サブのlfsは非対応

本当に、本当に複雑性が上がるのであまり推奨しない。
対応してるソフトもSourceTreeくらいだし。GitKrakenが対応していない。

Git subtree のパワー | Atlassian Japan 公式ブログ | アトラシアン株式会社
Git のマージ戦略のオプションとサンプル | Atlassian Git Tutorial

Differences between git submodule and subtree - Stack Overflow
git submodule と git subtree から見る外部リポジトリの取り扱い - tech.guitarrapc.cóm

split

subtree特有の機能。ディレクトリを切り出し、別のブランチとして切り分ける。
過去のコミットも切り分けて新しいブランチに反映するのが特徴。そのせいで、巨大なリポジトリでは時間がかかる。
--rejoinを付けると、次のsplit時にそれをつけてsplitした履歴より前を見なくなるらしい。

ちなみに、git subtree push中でsplitを使用している。

git subtree でリポジトリ in リポジトリを実現する│FORCIA CUBE│フォルシア株式会社
git-subtree移行メモ - Qiita

git lfs

大きいファイルを扱うときのやつ。
一つのファイルに対し、git上にポインターファイル、外部ストレージ上に実体、と分離する。
このシステム上、gitのポインターファイルはlfsであると認識させる必要がある。

.gitignoreが反映されない

キャッシュが残ってる。
git rm -r --cached [ファイル名]でキャッシュを削除すればいい。.で全指定しても問題ない。
大量のコミットを要求されるが、コミットログは.gitignoreを反映した部分しか残らない。

.gitignoreに記載したのに反映されない件 - Qiita

https vs ssh

sshの利点はパスワードを入力せずに済むこと。
httpsの利点は手軽。こちらでもパスワードを入力しない方法はあるが、その場合credential helperを使わないとセキュリティリスクになる。そのためPCでないとhttpsはほぼ使えない。

HTTPS vs SSH in git
termux ssh接続

文字化け

utf-8エンコードを指定する。
powershellならnotepad $PROFILEとして以下。

PowerShellでgit add -pを実行した際の日本語文字化け問題の解決策

bashならexport LESSCHARSET=UTF-8を.bashrcにでも書く。

https://www-creators.com/archives/78

特定ファイルの復元

logでファイルを見つけ、restoreで戻す。コミットを忘れず。
中身が知りたいならgit showを使う。

Gitで、特定のファイルを削除したコミットを見つけて復元する方法 · GitHub
[git] 戻したい時よく使っているコマンドまとめ Git - Qiita
Gitで過去に削除したファイルを検索、復元させる方法
commitしたファイルや変更箇所は”git show”で確認できる Git - Qiita

You asked to pull from the remote ‘github’, but did not specify

a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.

branchに設定されてるリモートブランチ(上流ブランチ、upstream branch)とpull対象が別だと怒られるやつ?

-u, もしくは—set-upstream origin/mainつけてpushすると上流ブランチがそっちに移る。
branchで直接いじる場合は-uか—set-upstream-to=origin/main。後者は=が必要。

上流ブランチがなくてエラーになった時の対応方法 Git - Qiita

ローカルブランチを上流ブランチにしたい

git push -u . プッシュしたいローカルブランチ名

Git で「追跡ブランチ」って言うのやめましょう Git - Qiita

蒸留ブランチに何が設定されているか知りたい

git branch -vv

リモートブランチを削除する

git push -d origin branch_name

pushを使うことに注意。

また、削除前にpullしたリモートブランチがローカルに残る問題はfetchで解決する。

git fetch —prune
もしくは
git fetch -p

常にこれを実行したい場合は、設定でprune=trueを書き込む。

git config —global fetch.prune true

[fetch]
	prune = true

Gitのリモートブランチを削除するまとめ GitHub - Qiita

submodule消去

$ git submodule deinit -f 追加したサブモジュール
$ git rm -f 追加したサブモジュール
$ rm -rf .git/modules/追加したサブモジュール 

[git] submoduleの削除、再追加について Git - Qiita

git rmを忘れず。

bareとmirror

どちらもベアリポジトリをとれる。
mirrorはgit remote update時にHEADを最新に追従してくれる。

git clone時のmirrorとbareの違い | exMedia

secretを含んだファイルをpushしちゃった

git filter-repoで削る。
履歴を弄ることになるのでバックアップを取る。
あとstashが消えるのでなんとかしとく。

まずは元で履歴からファイルを削除する。

git rm -r --cached PATH
git commit -a -m "message"
git push

次に新しくリポジトリをクローン。やらないとflesh clone云々でエラーが出る。

git clone URL

secretがあるとこを指定してfilter。

git filter-repo --invert-path --path PATH

git filter-repoを使用すると、リモートが削除される。
再度追加する。

git remote add URL

最後に履歴を弄った分を強制pushして終了。

git push origin --force --all

リポジトリからの機微なデータの削除 - GitHub Docs
公開予定でないソースをリモートにプッシュ・プルリクエストしてしまった時の対処法

GitHub & BitBucket HTML Preview
docs/content/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository.md at main · github/docs · GitHub
git filter-repoを使って過去のコミットの内容を書き換える | ikapblog

要するにめちゃくちゃ面倒(この後も個々のlocalやforkにはsecret残るので、それらの対処を行う)なので、最初から起きないようにするのが吉。

パブリックリポジトリならGitHub Secret scanning’s push protectionというのが使えるので、ONにしておく。

GitHub の Secret scanning’s push protection を試してみる

textとbinaryを分ける手法

先頭8000バイト以内にNULがあるかどうか。

Gitはどうやってテキストファイルとバイナリファイルを自動識別しているのか? diff - Qiita

githubとssh接続

ssh−agentにkey登録のひと手間がクライアント側に必要。
exec ssh-agent bashでエージェントを実行し、ssh-add privatekeypathで登録。

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

場合によってパーミッションエラーが出るので、chmod 600 privatekeypathで自分しか変更できないようにする。

https://qiita.com/yyy752/items/32f66d877de41655b7bb

取り消し

add前ならgit checkout -- .
個別にやるならgit checkout ファイル名orディレクトリ名
add後ならgit reset
個別ならgit reset ファイル名
コミット後ならgit reset --soft HEAD^

Gitの変更を取り消すには( git statusした時の modifiedの取り消し方やコミットの取り消し方など)

Githubに動画をアップ

GithubのMarkdownエディタにD&Dでいける。

過去ファイルを検索して引っ張ってくる

git grep "Post" $(git log --pretty=format:%H -- ./src/CanvasNodesView.ts)

git checkout (hash)

does not have a commit checked out

他でも起きるがsubmoduleで起きた。

git rm submoduleFolder
git submodule add submoduleURL

これでsubmoduleを追加しなおしただけ。
他に色々突っかかってたが、vscodeで一個ずつ削った。

git submodule がコンフリクトしたときの対処法 単に自分が古い場合編 - @kyanny’s blog
Submodule 同士でコンフリクリしたときの解決方法 - git | nju33

termuxで使う

termuxは/storage/emulated/0だと色々リンクとかで引っかかり倒す。
なので本体をhome直下に置きgit worktreeで読み取れる位置にセットするやり方。

gitコマンドはworktreeでセットしたところで使える。
ただ/storage/emulated/0ではなく~/storage/shared/から使う。

[Feature]: Make git usage on /storage/emulated/0 possible. · Issue #3777 · termux/termux-app
Git Worktreeをわかりやすく解説
徹底解説:git worktree の使い方 Git - Qiita

git submodule update —init —remote

updateは親で記録しているコミットに子を更新。
—initは親clone時に空になっているsubmoduleの本体ファイルを親記録コミットを元にclone。
—remoteは親記録コミットを更新。

git submodule update [—init|—remote] を勉強し直す Git - Qiita

repository path is not owned by current user

safedirectoryに追加。

git config --global --add safe.directory /storage/emulated/0/Documents/Niztra/sonolart/.obsidian /plugins/obsidian-wom