21

コミット数が非常に多いため、大量のgitレポジトリがあったので、ここでのアドバイスに従って、浅いクローンを作成しました。この新しいローカルリポジトリに変更を加えました。今度は、Githubのオリジンにプッシュします(次に、Herokuのステージングおよびプロダクションリモートにプッシュします)。おそらくいつか私はドキュメントを読むことを学ぶでしょう:

gitclone--depthコマンドオプションは言う

--depth指定されたリビジョン数に切り捨てられた履歴を持つシャロークローンを作成します。浅いリポジトリにはいくつかの制限があります(リポジトリからクローンを作成したり、リポジトリからフェッチしたり、リポジトリからプッシュしたり、リポジトリにプッシュしたりすることはできません)

では、どうすればこの状況から抜け出し、コードをGithubにプッシュできますか?

4

5 に答える 5

15

Git(1.8.3以降)には、浅いクローンの完全な履歴を取得する公式の方法があります。

git fetch --unshallow

git fetchのドキュメントから:

--unshallow

ソースリポジトリが完全な場合は、浅いリポジトリを完全なリポジトリに変換し、浅いリポジトリによって課せられるすべての制限を取り除きます。

ソースリポジトリが浅い場合は、現在のリポジトリがソースリポジトリと同じ履歴を持つように、可能な限りフェッチします。

于 2016-03-21T05:18:26.393 に答える
14

私は2つの理由で受け入れられた答えに同意しません:

  1. 失敗してファイルを忘れる理由はたくさんあります
  2. コミットメッセージと履歴が失われます

これが私の提案です:

グラフトポイント

グラフトポイントを含む$GIT_DIR/ .git/shallowファイルが必要です。履歴が十分に単純である場合、ドキュメントに別の方法が記載されていても、このグラフトポイントを使用してプッシュできるはずです。

パッチ

これにより、コミット履歴などを保持できます。

git format-patch origin..master

次に、オリジンを複製して再適用します。

git clone origin_path
cp shallow_clone/*.patch deep_clone
cd deep_clone
git am *.patch

今回はプッシュできます!

git push
于 2012-07-08T08:50:32.733 に答える
8

浅いクローンで作業していて、履歴の不足が問題を引き起こしている場合は、オプションを使用してより多くの履歴をフェッチでき--depthます。

git fetch --depth=20

ここで、20はフェッチするコミットの量です。それでも不十分な場合は増やしてください。

--depthでオプションを使用することもできますgit pull

于 2012-08-06T19:32:30.403 に答える
4

オプション1)元のリポジトリがまだある場合は、プッシュする前にそこからフェッチするだけです。

git fetch --unshallow

オプション2) 注意!これは、履歴が失われ、競合が発生しやすいため、新しいリポジトリにのみお勧めします

フェッチ元のリポジトリをすでに削除している場合は、ですべての履歴を破棄する必要があります。

 git filter-branch -- --all
 git push

git filter-branch:Gitの改訂履歴を書き換えることができます

--:フィルターブランチオプションをリビジョンオプションから分離します

--all:すべてのブランチとタグを書き換えます

于 2017-08-21T10:13:26.573 に答える
3

浅いクローンリポジトリをBitbucketサーバーにプッシュする際にも同様の問題が発生し、古い履歴にアクセスできませんでした。最後に、私は解決策を見つけました。以下のコメント付きのサンプルスクリプトを参照してください。

#!/bin/bash

# Fix shallowness
mv .git/shallow .git/info/grafts

git checkout --orphan temp # create temp empty commit
git reset --hard
git commit -m "Init" --allow-empty

# Replace all shallow commits ids with new commit id. I copy-paste all refs from shallow file 
git replace 196cdbdb30e608aae2fd7cbe97cc8c0e6fa66c06 <commit_id_of_empty_init_above>
git replace 4c645849b296aaafc1809a9e1537c0fb305167ad <commit_id_of_empty_init_above>
git replace 50eab8bd8c416c47354331211b1efd8688ad8e97 <commit_id_of_empty_init_above>
git replace 649dc7577b87d1b05dff05bf9adc5e46f6612dfa <commit_id_of_empty_init_above>
git replace 6902148fde7b98ff0d6b6c6ebe929590322c95ff <commit_id_of_empty_init_above>
git remote set-url origin http://<username>:<password>@<example.com:port/repo.git> # reference to a remote repo to push
git push origin 'refs/replace/*' # push replace refs to remote repo first
git push -u origin master # push to master, finally

# Clear some garbage just in case
git filter-branch --tag-name-filter cat -- --all # rewrite history
git push --force origin
git fsck # check that everything is ok
于 2015-10-26T13:34:42.340 に答える