質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

Q&A

1回答

1527閲覧

Gitで使用しているディレクトリのサイズを小さくする方法は

taro373

総合スコア189

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitLab

GitLabは Gitoliteをブラウザから管理できるようにする Rubyアプリケーションで、 GitHubのようなサービスをクローズドな環境に独自で構築できるように 公開されたものです。

0グッド

0クリップ

投稿2021/10/28 01:05

編集2021/10/28 01:06

Gitで使用しているディレクトリのサイズを小さくする方法はないでしょうか?

GitLabに大きなファイル(700M強)を間違えてadd,commit,pushしてしまいました。
ローカルもリモート側もファイルを削除しました。
duコマンドでローカルのディレクトリサイズを調べると、995Mでした。
どこが?と一つ下の階層をduコマンドで調べると、合計で200Mほどしかありません。
そこで、隠しファイルも調べると、.gitが理由でした。

$ du -sh .git/objects 765M .git/objects

実際には、packファイルがほぼそのサイズでした。

$ ls -lth .git/objects/pack total 1542008 -r--r--r-- 1 hoge staff 25K 10 27 15:28 pack-bb04c989f4c5947bd0749d56f18c68c2e68537a3.idx -r--r--r-- 1 hoge staff 738M 10 27 15:28 pack-bb04c989f4c5947bd0749d56f18c68c2e68537a3.pack

git gcを実行すると12M小さくなりましたが、割合としては大きくありません。
誤ってpushしたファイルを“無かったこと”にはできないのでしょうか。

$ git gc Enumerating objects: 888, done. Counting objects: 100% (888/888), done. Delta compression using up to 4 threads Compressing objects: 100% (737/737), done. Writing objects: 100% (888/888), done. Total 888 (delta 543), reused 226 (delta 135) Computing commit graph generation numbers: 100% (143/143), done. enteropathway_table $ du -sh .git/objects 753M .git/objects

いろいろと調べて、git filter-branch で可能かと思えています。
使い始めたばかりで(そのこともあって、このような誤ったファイルをpushしてしまった)
なにが行われるのか、リモート側とローカル側の区別がいま一つ理解できず質問しました。

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch <ファイル名orフォルダ名>" --prune-empty -- --all

参考:https://note.dokeep.jp/post/git-filter-branch-rm/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/10/28 01:23

質問文で自己完結しているようですが、聞きたいことはまだ残っていますか?
taro373

2021/10/28 02:25

はい、申し訳ありません。説明不足でした。 意味が理解できずに実行に不安があります(pushに時間がかかる等の問題が起きているのではないので)十分に理解した上で実行したいと考えています。 とりあえずローカルのサイズを小さくしたいのですが git filter-branch に git rm を指定して実行してもその段階でローカルディレクトリのサイズは小さくならなない、と読み取りました。 ・これ(git filter-branch)は何をしているのでしょうか  (なぜこれでローカルのサイズがこれでは小さくならない?) ・git gcはローカル側?リモート側どちらに対する処理なのでしょうか? ・「コミットのハッシュ値が変わる」は初めて知りました(「コミットのハッシュ値」とはなんだろうのレベル)  強制的にpush(git push -f)を行わないと、これ以降リモートのリポジトリは使えなくなるのしょうか
退会済みユーザー

退会済みユーザー

2021/10/28 18:37

実際に何をしてどうなったのか再現手順がなければ原因は分かりませんし、リモートのリポジトリに行っていい操作も分からないので回答もできません。とりあえず、ローカルリポジトリを作成→コミット破棄→gcしてローカルリポジトリのサイズ減少を確認できる(100MBのコミットを消して100MB減ってる)スクリプトを用意しました。ご参考までに。 # git repos.構築 mkdir tmp cd tmp git init dd if=/dev/urandom of=./hoge001.dat bs=1MiB count=1 git add . git commit -m "initial commit" dd if=/dev/urandom of=./hoge002.dat bs=1MiB count=100 # コレがデカイ git add . git commit -m "2nd commit" dd if=/dev/urandom of=./hoge003.dat bs=1MiB count=1 git add . git commit -m "3rd commit" du -sh .git hoge00?.dat # 2md commitの削除 git branch tmp git reset --hard HEAD~2 git cherry-pick tmp git switch tmp git reset --hard HEAD~2 git switch master git branch --delete tmp # gc du -sh .git hoge00?.dat # https://zenn.dev/ulwlu/articles/cc2443d32e2444 を参考にしました git \ -c gc.pruneExpire=now \ -c gc.worktreePruneExpire=now \ -c gc.reflogExpire=now \ -c gc.reflogExpireUnreachable=now \ -c gc.rerereResolved=now \ -c gc.rerereUnResolved=now \ gc --aggressive du -sh .git hoge00?.dat
guest

回答1

0

なぜこれでローカルのサイズがこれでは小さくならない?

処理速度優先なので、不要なデータを即座に削除するわけではないからです。

git gcはローカル側?リモート側どちらに対する処理なのでしょうか?

リポジトリごとの処理です。ローカルで実行すればローカルでの処理が行われます。

強制的にpush(git push -f)を行わないと、これ以降リモートのリポジトリは使えなくなるのしょうか

filter-branchする前のコミットも残り続けて、データの削除がされずコミットをいたずらに複雑化させるだけという、全くの藪蛇となります。

投稿2021/10/28 02:30

maisumakun

総合スコア146618

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2021/10/28 05:04

> リポジトリごとの処理です。ローカルで実行すればローカルでの処理が行われます。 $ git gc を実行しましたが、これはどちらで実行されたのでしょうか? ローカル側で整理が行われたのかと、自信がないなか考えていました。 「リポジトリごとの」ということは、リモート側に対しても実行できるのですか? であるとすると、それは何かオプションを指定するのでしょうか?
maisumakun

2021/10/28 05:19

> 「リポジトリごとの」ということは、リモート側に対しても実行できるのですか? GitLabでできるかどうかはわかりません(ただし、gcは時たま自動で起動することがあります)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問