コミット数が非常に多いため、大量のgitレポジトリがあったので、アドバイスに従ってください ここ 浅いクローンを作成しました。この新しいローカルリポジトリに変更を加えました。次に、Githubのオリジンにプッシュします(次に、Herokuのステージングおよびプロダクションリモートにプッシュします)。おそらくいつか私はドキュメントを読むことを学ぶでしょう:
Git clone--depthコマンドオプションは言う
--depth指定されたリビジョン数に切り捨てられた履歴を持つ浅いクローンを作成します。浅いリポジトリにはいくつかの制限があります(リポジトリから複製またはフェッチしたり、リポジトリからプッシュしたり、リポジトリにプッシュしたりすることはできません)
では、どうすればこの状況から自分の選択を解除して、コードをGithubにプッシュできますか?
Git(1.8.3以降)には、浅いクローンの完全な履歴を取得する公式の方法があります。
git fetch --unshallow
gitフェッチドキュメント から:
--unshallow
ソースリポジトリが完全な場合は、浅いリポジトリを完全なリポジトリに変換し、浅いリポジトリによって課せられるすべての制限を取り除きます。
ソースリポジトリが浅い場合は、現在のリポジトリがソースリポジトリと同じ履歴を持つように、可能な限りフェッチします。
私は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
浅いクローンで作業していて、履歴の不足が問題を引き起こしている場合は、--depth
オプションを使用してより多くの履歴をフェッチできます。
git fetch --depth=20
ここで、20はフェッチするコミットの量です。それでも不十分な場合は増やしてください。
--depth
オプションをgit pull
と一緒に使用することもできます。
浅いクローンリポジトリを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
オプション1)元のリポジトリがまだある場合は、プッシュする前にリポジトリからフェッチするだけです。
git fetch --unshallow
オプション2)BEWARE!これは新しいリポジトリにのみ推奨されます。これは[〜#〜] will [〜#〜]履歴が失われ、非常に高いためです。衝突しやすい!!
フェッチ元のリポジトリをすでに削除している場合は、ですべての履歴を破棄する必要があります。
git filter-branch -- --all
git Push
git filter-branch
:Gitの改訂履歴を書き換えることができます
--
:フィルターブランチオプションをリビジョンオプションから分離します
--all
:すべてのブランチとタグを書き換えます