6

2 つの lfs 追跡ファイルを含む repoA があります。私はこのようにレポBにそのレポを持ってきています

cd repoB
git fetch repoA somebranch
git checkout -b temp FETCH_HEAD
git rebase someotherbranch

これにより、「Applying: ...」の数行が出力され、次に

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
    Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes
Please, commit your changes or stash them before you can merge.
Aborting
error: Failed to merge in the changes.
Patch failed at 0340 update server
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

これを修正するにはどうすればよいですか? 注: このファイルは repoAには存在しません。この問題は、git lfs の問題に完全に関連しているようです。

gitステータスはこれを示しました

$ git status
rebase in progress; onto 5af1f30
You are currently rebasing branch 'gamepad' on '5af1f30'.
  (all conflicts fixed: run "git rebase --continue")

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes
    deleted:    Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.sha256.bytes

no changes added to commit (use "git add" and/or "git commit -a")

注:2つのファイル(ブードゥー)を追加してコミットしようとしましたgit rebase --continueが、次にファイルが履歴で変更されるまで続けられ、その時点で同様のエラーが発生しました。私も同じことをして、やっと終わりました。しかし、それを別のブランチにリベースしようとすると、

Downloading Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (7.48 MB)
Error downloading object: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (4743b094eeab821140773213ebabdaa81c9ac2eb1be1108e70e8d51ae52873dd)

Errors logged to /Users/gregg/src/hft-unity3d/.git/lfs/objects/logs/20160603T213456.110362284.log
Use `git lfs logs last` to view the log.
error: external filter git-lfs smudge -- %f failed 2
error: external filter git-lfs smudge -- %f failed
fatal: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes: smudge filter lfs failed
Could not apply dc378b5d715103e9af0ee805ff2a3be1159739aa... add lfs support

これは、git lfs を正しく使用する方法がわからないことを示唆しています。

更新 1

したがって、すべてのレポに git lfs をインストールする必要があることがわかりました。これは、言うドキュメントからはまったく明らかではありません

Git LFS を設定する必要があるのは 1 回だけです。

 git lfs install

実際には一度ではなく、レポごとに一度であることがわかりました。

次に、リモートに保存されたファイルを取得する場所を知るために必要な問題を読みます。追跡されているリモートブランチに基づいてこれを行うため、最初からやり直します

git clone git@github.com/me/repoA
cd repoA
git lfs install
git remote add repoB git@github.com/me/repoB
git fetch repoB
git checkout -b temp repoB/somebranch

これは repoB/somebranch を一時的にチェックアウトし始めますが、失敗します

Downloading Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (7.48 MB)
Error downloading object: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes (f8c42a7c55f610768ce50ff93d09fc63fa897de867290dafee2e84d64e10de4e)

Errors logged to /Users/gregg/temp/delme-hft-unity3d/.git/lfs/objects/logs/20160603T231351.670335751.log
Use `git lfs logs last` to view the log.
error: external filter git-lfs smudge -- %f failed 2
error: external filter git-lfs smudge -- %f failed
fatal: Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes: smudge filter lfs failed

私の知る限り、現在正しいブランチを追跡しています。これは、ファイルがアップロードされたのと同じリモートの同じブランチです。

更新 2

最後の1つoriginからやり直しますが、repoAのクローン作成後にrepoBを指すように変更します

git clone git@github.com/me/repoA
cd repoA
git lfs install
git remote remove origin
git remote add origin git@github.com/me/repoB
git fetch repoB
git checkout -b temp origin/somebranch

これは、以前と同じように機能します

でも今

git checkout -b other master
git branch --set-upstream-to origin/somebranch
git rebase master temp

以前と同じ場所で失敗する

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
    Assets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes
Please, commit your changes or stash them before you can merge.
Aborting
error: Failed to merge in the changes.
Patch failed at 0358 update server
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
4

2 に答える 2

5

どうやら問題は、gitがフックを呼び出すときに現在の追跡ブランチ情報を渡さないため、lfsがファイルを見つける方法がないことです。デフォルトでは、originのリンクを使用するだけです

したがって、これを行うには、オプションで lfs をインストールする必要があり--skip-smudgeます。これは基本的に lfs にファイルをダウンロードしないように指示します。期待どおりにマージを行います。次にgit lfs pull、ファイルの取得場所を指定できるリモートパラメーターがあります

すべてが完了したら、入力git lfs installして通常の状態に戻すことができると思います。以前のレポの lfs ストア (repoB) から新しいレポの lfs ストア (repoA) にダウンロードしたすべてのファイルを取得するには、おそらく a git lfs fetch --all repoBandを実行する必要があります。git lfs push --all repoA somebranch

このgithubの問題からのすべてのステップ

# This disables smudging for the 'git clone'
# and then calls 'git lfs pull' for you
git lfs clone git@github.com:me/repoB.git
cd repoB
git lfs install --skip-smudge --local # affects only this clone

git fetch repoA
git checkout -b temp repoA/somebranch
git rebase master

git lfs fetch --all repoA
git lfs checkout
git push origin temp

git lfs push --all origin temp
git lfs install --force --local

このコマンドは、 (LFS オブジェクトをダウンロードする) および(ローカルにダウンロードしたファイルを作業ディレクトリにコピーする)git lfs pullを呼び出すことと基本的に同じです。したがって、私の例では、コマンドを介してオブジェクトをダウンロードするだけです。git lfs fetchgit lfs checkoutgit lfs fetch --all

単一のコマンドで汚れフィルターを無効にする場合は、次のコマンドも使用できますGIT_LFS_SKIP_SMUDGE

$ GIT_LFS_SKIP_SMUDGE=1 git pull
$ git lfs pull
于 2016-06-03T15:56:34.323 に答える
0

からのコミットによりrepoA、ファイルが変更されましたAssets/HappyFunTimes/HappyFunTimesCore/Server/Resources/HFTOSXServer.bytes

この同じファイルはrepoB作業ツリーにもあります。Git は、ファイルを置き換えることができないことを認識しています。それを修正するには、git が提案していることを実行する必要があります。Git は、エラーの修正方法を教えてくれることがよくあります。

ローカルの変更をスタッシュまたはコミットします。あなたの場合、変更を隠し、リベースを行い、隠し場所をポップする方が良いようです。これにより、次のコマンドが得られます。

cd repoB
git stash
git fetch repoA somebranch
git checkout -b temp FETCH_HEAD
git rebase someotherbranch
git stash pop // You may need to resolve conflict using git mergetool

開始する前に、以前のリベースの試みを避けるようにしてください。

于 2016-06-03T13:39:02.147 に答える