2

レポートの PDF スナップショットをコミットしたリポジトリがあります。git lfs を試して、生活の質が向上するかどうかを確認したい。

ここ ( https://github.com/rtyley/bfg-repo-cleaner/releases )の手順に従って、BFG を使用して古いバイナリを消去し、lfs に移行しました。リポジトリに Gitlab サーバーを使用することに関連するいくつかのしわがありましたが、最終的にはこれでうまくいったと思います。

私たちが何をしたかを示し、最後にマージ競合のクリーンアップについて質問するために書いています。

抄録をお見せします。「--mirror」クローン (裸のレポ) をチェックアウトし、BFG がその作業を行い、いじってからプッシュバックします。

guides-to-lfs$ git clone --mirror git@gitlab.kucenter.edu:crmda/guides.git
Cloning into bare repository 'guides.git'...
X11 forwarding request failed on channel 0
remote: Counting objects: 865, done.
remote: Compressing objects: 100% (527/527), done.
remote: Total 865 (delta 318), reused 834 (delta 303)
Receiving objects: 100% (865/865), 151.75 MiB | 25.74 MiB/s, done.
Resolving deltas: 100% (318/318), done.
Checking connectivity... done.

guides-to-lfs$ cd guides.git/

guides.git$ java -jar ~/bin/bfg-1.12.13.jar --convert-to-git-lfs '*.{pdf,ogv,tar.gz,zip}' --no-blob-protection

Using repo : /home/pauljohn/GIT/CRMDA/guides-to-lfs/guides.git

Found 0 objects to protect
Found 3 commit-pointing refs : HEAD, refs/heads/master, refs/tmp/fd782dd8787a3ffb673455d1eafb9869/head

Protected commits
-----------------

You're not protecting any commits, which means the BFG will modify the contents of even *current* commits.

This isn't recommended - ideally, if your current commits are dirty, you should fix up your working copy and commit that, check that your build still works, and only then run the BFG to clean up your history.

Cleaning
--------

Found 124 commits
Cleaning commits:       100% (124/124)
Cleaning commits completed in 1,933 ms.

Updating 2 Refs
---------------

    Ref                                              Before     After   
    --------------------------------------------------------------------
    refs/heads/master                              | e3327ef1 | e4ac76a2
    refs/tmp/fd782dd8787a3ffb673455d1eafb9869/head | 74ccc454 | 6639b246

Updating references:    100% (2/2)
...Ref update completed in 19 ms.

Commit Tree-Dirt History
------------------------

    Earliest                                              Latest
    |                                                          |
    .......DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD

    D = dirty commits (file tree fixed)
    m = modified commits (commit message or parents changed)
    . = clean commits (no changes to file tree)

                            Before     After   
    -------------------------------------------
    First modified commit | cdd8f486 | 5e6b64eb
    Last dirty commit     | e3327ef1 | e4ac76a2

Changed files
-------------

    Filename                                               Before & After                                               
    --------------------------------------------------------------------------------------------------------------------
    01.LISREL.Syntax.pdf                                 | 71a17dcc ⇒ 7f217f4d                                          
    02.ReadingDataIntoLISREL.pdf                         | c05c3fe6 ⇒ e7238e11                                          
    03.InterpretingLISRELOutput.pdf                      | 6ef054c8 ⇒ a2a63813                                          
    04.StartingValuesInLISREL.pdf                        | 335d7a09 ⇒ c86439ee, 9f6fc232 ⇒ 05182a86                     
    05.WhatToReport.pdf                                  | 2bee7a8d ⇒ 1106d2f4, 3d30b103 ⇒ ce27382c                     
    06.Satorra-BentlerChi-Sq.pdf                         | 94ec6fd2 ⇒ b81d08b4, 7cd29d48 ⇒ 704d5f30                     
    ...

In total, 375 object ids were changed. Full details are logged here:

guides.git.bfg-report/2016-10-05/14-03-18

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive

guides.git$ git reflog expire --expire=now --all

guides.git$ git gc --prune=now

これを試す場合は、レポにプッシュバックする際のトラブルに備える必要があります。1 つの問題は、8.12 より前の Gitlab では、git の SSH 転送と git lfs の HTTPS 転送の間でパスワード管理が統合されていなかったことです。もう 1 つの問題は、Gitlab プロジェクトの「保護」です。これは、Gitlab を使用している場合に見られる可能性があります。初めてプッシュしたときにこれを見ました:

guides.git$ git push
X11 forwarding request failed on channel 0
Git LFS: (0 of 105 files) 0 B / 140.38MB                          
http: Post https://gitlab.kucenter.edu/crmda/guides.git/info/lfs/objects/batch: x509: certificate signed by unknown authority
http: Post https://gitlab.kucenter.edu/crmda/guides.git/info/lfs/objects/batch: x509: certificate signed by unknown authority
error: failed to push some refs to 'git@gitlab.kucenter.edu:crmda/guides.git'

この問題を回避するためにいくつかの変更を加えました。Gitlab の最新バージョン (8.12.4) が必要でした。古い証明書を無視するように Git に指示する必要がありました。Gitlab サーバーでは、開発者がプッシュできるようにプロジェクトを「保護しない」必要がありました。私は所有者であり、通常の git の変更をプッシュできるため、なぜそれが必要なのかわかりませんが、どうやら lfs の統合は異なるようです。大騒ぎした後、リポジトリへのプッシュバックに成功しました。

guides.git$ GIT_SSL_NO_VERIFY=true git push
X11 forwarding request failed on channel 0
Git LFS: (0 of 0 files, 105 skipped) 0 B / 0 B, 140.38 MB skipped                                                                   Counting objects: 866, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (520/520), done.
Writing objects: 100% (866/866), 32.94 MiB | 26.41 MiB/s, done.
Total 866 (delta 311), reused 866 (delta 311)
To git@gitlab.kucenter.edu:crmda/guides.git
 + e3327ef...e4ac76a master -> master (forced update)
 + 74ccc45...6639b24 refs/tmp/fd782dd8787a3ffb673455d1eafb9869/head -> refs/tmp/fd782dd8787a3ffb673455d1eafb9869/head (forced update)

成功!

次に、このリポジトリの作業ディレクトリに戻り、PDF ファイルが保存されているディレクトリに戻り、git pull を試しました。対処しなければならないマージの競合がたくさんあります。

guides$ git pull
X11 forwarding request failed on channel 0
remote: Counting objects: 792, done.
remote: Compressing objects: 100% (491/491), done.
remote: Total 792 (delta 294), reused 791 (delta 293)
Receiving objects: 100% (792/792), 32.92 MiB | 54.09 MiB/s, done.
Resolving deltas: 100% (294/294), done.
From gitlab.kucenter.edu:crmda/guides
 + e3327ef...e4ac76a master     -> origin/master  (forced update)
warning: Cannot merge binary files: keyword_guide/guide_keywords.pdf (HEAD vs. e4ac76a2561fd4dc3ca52971e8ee3d5cbe930a0c)
warning: Cannot merge binary files: Spanish_KUant_Guides/PDFs/9._opcion_RP_en_LISREL.pdf (HEAD vs. e4ac76a2561fd4dc3ca52971e8ee3d5cbe930a0c)
warning: Cannot merge binary files: Spanish_KUant_Guides/PDFs/8._Imputacion_de_datos.pdf (HEAD vs. e4ac76a2561fd4dc3ca52971e8ee3d5cbe930a0c)
warning: Cannot merge binary files: Spanish_KUant_Guides/PDFs/7._bootstrap.pdf (HEAD vs. e4ac76a2561fd4dc3ca52971e8ee3d5cbe930a0c)
warning: Cannot merge binary files: Spanish_KUant_Guides/PDFs
[...snip out hundreds of those ...]
Automatic merge failed; fix conflicts and then commit the result.

おそらく、リモートのクリーンなクローンを作成して、そこから先に進むと思います。私がインターネットで見つけた指示は、それについてはあまり役に立ちません。それらは主に、進行中の lfs や lfs のクローンを扱うことについてではなく、lfs を使い始めることに関するものです。誰かがこのことを複製し、lfs を持っていなかったらどうなるか、少し心配です。ああ、まあ、見てみましょう。

これが私の質問です。これらのバイナリ競合のすべてに対処したい場合、どうすればよいでしょうか? サーバーからのすべての変更を単に受け入れたい場合は、競合する「fn.pdf」ごとに1回、これを何度も実行する必要があるようです。

$ git checkout --theirs -- fn.pdf
$ git add fn.pdf

それを何度も行うのは面倒に思えますが、できると思います。

また、こちら (バイナリ ファイルとの Git の競合の解決) で試してみるため のアドバイスも見つけました。

$ git mergetool

しかし、私はそれとどのように相互作用するかを確実に伝えることはできません. diff は 3 列のバッファーを持つ gvim フレームを起動しますが、うまくナビゲートできませんでした。編集者の地獄に私を着陸させているように私には思えます。

4

1 に答える 1

1

おそらく、リモートのクリーンなクローンを作成して、そこから先に進むと思います。

そうです、これは、BFG、フィルターブランチなど、履歴を書き換えるツールを使用した後の最も重要なステップです (通常は、その履歴で参照されている不要なファイルを削除します)。BFG のホームページには次のように書かれています。

この時点で、すべての人がレポの古いコピーを捨てて、きれいな新しい元のデータの新しいクローンを作成する準備が整いました。すべての古いクローンを削除することをお勧めします。古いクローンには汚れた履歴があり、新しくクリーンアップされたレポに押し戻すリスクを冒したくないからです。

新しい/書き換えられた履歴は、その時点以降のすべてのコミット ハッシュが変更されるため、Git に関する限り、古い履歴とは完全に異なる履歴のある時点 (書き換えの最初の変更点) からのものになります。進行する唯一の正気の方法は、すべての開発者が古い履歴の現在のクローンを廃止し、新しいクローンを取得することです。理論的にはこれらを更新することはできますが、多くの注意を払う必要がありますが、それほど価値はありません。

古いクローンを削除すると、誰かが古い履歴への参照をプッシュする可能性が減り、古い履歴とそこに含まれていた不要なファイルが再導入されます。

于 2016-10-10T04:42:03.277 に答える