履歴なしでGitリポジトリをコピーする


200

現在、公開したいgithubにプライベートリポジトリがあります。ただし、最初のコミットの一部には、公開したくない情報(ハードコードされた資格情報など)が含まれています。

コミット履歴の一部または全部を含めずに、最新のコミットを公開する(以前のコミットをパブリックリポジトリで実際に必要としない、または望んでいない)最も簡単な方法は何ですか?


新しいリポジトリを作成してみませんか?
ステファン

2
@Stephan新しいレポジトリを作成しているところですが、古いレポジトリから最新の状態を取得して新しいレポジトリにコミットするにはどうすればよいですか?
Rafe、2015年

19
.gitフォルダーを削除して、ソースがあるフォルダーで再度git initを実行できます
Stephan

2
.gitフォルダーを削除すると、2つのリポジトリに互換性がなくなり、一方から他方にマージできなくなります
Arnold Roa

リベースできませんか?あなたは文字通りすべての古いコミットを押しつぶしてから、(強制的に)プッシュします。
xaxxon

回答:


322

クローン作成するときに、履歴の深さを制限できます。

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

限られた履歴が必要な場合はこれを使用しますが、それでもいくつか使用します。


40
この男にcookieを(この回答に正しいマークを付ける形で)
与え

7
これは、リモートのパブリックレポジトリにプッシュできるようにするという質問で示されている使用目的には対応していません。浅いクローンをプッシュしようとすると、になりshallow update not allowedます。
ブラッドノックス

280

次のコマンドを使用します。

git clone --depth <depth> -b <branch> <repo_url>

どこ:

  • depth含めたいコミットの量です。つまり、最新のコミットを使用したいだけの場合git clone --depth 1
  • branchクローン元のリモートブランチの名前です。つまり、masterブランチの使用による最後の3つのコミットが必要な場合git clone --depth 3 -b master
  • repo_url リポジトリのURLです

7
これは実際にはGautierと同じ答えですが、より完全で例があります。
ALED

3
確かにそうです。時々、例は必要なものです。私にとって、それを書き出すことが問題を明らかにしたものです
Agam Rafaeli 2017

3
メインの答えに+1しますが、深さを適用するブランチの選択について説明するためのこの答えにも-これはクローンコマンドの一部であることは知っていますが、それはすべてを私の単純な心の中でうまく結び付けています...そして私はシンプルが好きです
:)

7
これはどのように質問に答えますか?これは、ローカルで浅いクローンを作成するだけですが、その後はどうでしょうか。限られた履歴を持つこのローカルコピーを新しいリポジトリにどのようにコピーしますか?
BradDaBug

4
@BradDaBugは有効なポイントを提示します。上記の指示に従って深度を1に制限し、リモートの起点を変更してから、新しいリポジトリにプッシュしようとしました。しかし、エラーメッセージが表示されましたshallow update not allowed。このスタックオーバーフローの回答は、この場合に役立ちます。
クレイグマイルズ

18

(Stephanが言ったように)履歴を必要としない/必要としないため、.gitフォルダを削除することはおそらく最も簡単な方法です。

だからあなたはできる :最新のコミットから新しいレポを作成しますどのようにクローンシード/キックスタートのプロジェクトに全体の病歴のありません?

git clone <git_url>

次にを削除し.git、その後実行します

git init

または、現在のリポジトリ再利用する場合現在のコミットをGitリポジトリの唯一の(初期)コミットにしますか?

上記の手順に従ってください。

git add .
git commit -m "Initial commit"

リポジトリにプッシュします。

git remote add origin <github-uri>
git push -u --force origin master

6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master

2
--depth 1履歴はまたして削除されたため、この場合には不要ですrm -rf .git
rayphi

3
私はこのようにすると思います:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi

11
@rayphiはい、これ--depth 1は不要ですが、無害でもあり、ネットワーク帯域幅を少し節約します(とにかく削除しようとしている履歴を取得しても意味がありません)
Silas S. Brown

1
リポジトリの互換性を維持したい場合は、これをお勧めしません。
Arnold Roa

.gitを削除すると、すべてのgitフックも削除されます。
JudaPriest

0

これは、リベースを押しつぶすこととまったく同じではありませんか?最後のコミット以外のすべてを押しつぶしてから、(強制的に)プッシュします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.