web-dev-qa-db-ja.com

浅いクローンの後にgithubにプッシュする

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

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

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

では、どうすればこの状況から自分の選択を解除して、コードをGithubにプッシュできますか?

19
snowangel

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

git fetch --unshallow

gitフェッチドキュメント から:

--unshallow

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

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

12
sj26

私は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
14
Antoine Pelisse

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

git fetch --depth=20

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

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

8
Gregor

浅いクローンリポジトリを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
3
dnaumenko

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

git fetch --unshallow

オプション2)BEWARE!これは新しいリポジトリにのみ推奨されます。これは[〜#〜] will [〜#〜]履歴が失われ、非常に高いためです。衝突しやすい!!

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

 git filter-branch -- --all
 git Push

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

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

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

3
Eli