Sao chép một repo git không có lịch sử


200

Tôi hiện có một kho lưu trữ riêng trên github mà tôi muốn công khai. Tuy nhiên, một số cam kết ban đầu chứa thông tin mà tôi không muốn công khai (các thông số được mã hóa cứng, v.v.).

Con đường dễ nhất để công khai cam kết mới nhất (tôi không thực sự cần hoặc muốn các cam kết trước đó trong kho lưu trữ công cộng) mà không bao gồm một số hoặc tất cả lịch sử cam kết là gì?


Tại sao bạn không tạo một kho lưu trữ mới?
Stephan

2
@Stephan Tôi ổn khi tạo một kho lưu trữ mới, nhưng làm cách nào để lấy trạng thái mới nhất từ ​​kho lưu trữ cũ và cam kết nó với kho mới?
Rafe

19
bạn chỉ có thể xóa thư mục .git và thực hiện lại git init trên thư mục mà nguồn của bạn là
Stephan

2
Xóa thư mục .git sẽ khiến hai repositor của bạn không tương thích, bạn sẽ không thể hợp nhất từ ​​cái này sang cái khác
Arnold Roa

Bạn không thể rebase nó? Bạn thực sự chỉ cần đè bẹp tất cả các cam kết cũ và sau đó (lực lượng) đẩy.
xaxxon

Câu trả lời:


322

Bạn có thể giới hạn độ sâu của lịch sử trong khi nhân bản :

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

Sử dụng điều này nếu bạn muốn lịch sử hạn chế, nhưng vẫn còn một số.


40
Cung cấp cho người đàn ông này một cookie (dưới dạng đánh dấu câu trả lời này chính xác) :)
FateNuller

7
Điều này không giải quyết được mục đích sử dụng được ngụ ý bởi câu hỏi, nghĩa là có thể đẩy đến một kho lưu trữ công cộng, từ xa. Cố gắng đẩy một bản sao nông kết quả trong shallow update not allowed.
Brad Knox

280

Sử dụng lệnh sau:

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

Ở đâu:

  • depthlà số lượng cam kết bạn muốn bao gồm. tức là nếu bạn chỉ muốn sử dụng cam kết mới nhấtgit clone --depth 1
  • branchlà tên của nhánh từ xa mà bạn muốn sao chép từ đó. tức là nếu bạn muốn 3 lần xác nhận cuối cùng từ masterviệc sử dụng chi nhánhgit clone --depth 3 -b master
  • repo_url là url của kho lưu trữ của bạn

7
Đây thực sự là câu trả lời tương tự Gautier nhưng đầy đủ hơn và với một ví dụ.
aled

3
Quả thực là như vậy. Đôi khi ví dụ là những gì cần thiết. Đối với tôi, viết nó ra là điều làm rõ vấn đề
Agam Rafaeli

3
+1 cho câu trả lời chính, nhưng cũng cho câu trả lời này để giải thích về việc chọn nhánh nào bạn muốn áp dụng độ sâu - tôi biết đây là một phần của lệnh clone - nhưng nó liên kết tất cả với nhau trong tâm trí đơn giản của tôi ... và tôi thích đơn giản :)
code_fodder

7
Làm thế nào để trả lời câu hỏi này? Tất cả điều này là tạo ra một bản sao nông tại địa phương, nhưng sau đó thì sao? Làm thế nào để bạn sao chép bản sao cục bộ này với lịch sử giới hạn vào một repo mới?
BradDaBug

4
@BradDaBug đưa ra một điểm hợp lệ. Tôi đã làm theo các hướng dẫn ở trên giới hạn độ sâu xuống 1, sau đó thay đổi nguồn gốc từ xa và sau đó cố gắng đẩy sang repo mới của tôi. Tuy nhiên, tôi đã nhận được một thông báo lỗi shallow update not allowed. Tôi thấy câu trả lời tràn ngăn xếp này là hữu ích trong trường hợp này.
Craig Myles

18

Xóa .gitthư mục có lẽ là con đường dễ nhất vì bạn không muốn / cần lịch sử (như Stephan đã nói).

Vì vậy, bạn có thể tạo một repo mới từ cam kết mới nhất của mình: ( Làm thế nào để sao chép dự án khởi đầu hạt giống / khởi động mà không có toàn bộ lịch sử? )

git clone <git_url>

sau đó xóa .gitvà sau đó chạy

git init

Hoặc nếu bạn muốn sử dụng lại repo hiện tại của mình: Tạo cam kết hiện tại thành cam kết duy nhất (ban đầu) trong kho Git?

Thực hiện theo các bước trên sau đó:

git add .
git commit -m "Initial commit"

Đẩy đến repo của bạn.

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
điều --depth 1này là không cần thiết trong trường hợp này vì lịch sử cũng bị xóa vớirm -rf .git
rayphi

3
Tôi nghĩ rằng tôi sẽ làm như thế này: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 vâng, điều --depth 1này là không cần thiết nhưng nó cũng vô hại và nó tiết kiệm được một chút băng thông mạng (không có điểm nào lấy một lịch sử mà bạn sắp xóa)
Silas S. Brown

1
Tôi không khuyên bạn nên làm điều này nếu bạn muốn giữ cho kho lưu trữ của bạn tương thích.
Arnold Roa

Loại bỏ .git cũng loại bỏ tất cả các móc git.
JudaPriest

0

Đây không phải là chính xác những gì một cuộc nổi loạn làm gì? Chỉ cần đè bẹp mọi thứ trừ lần cam kết cuối cùng và sau đó (lực lượng) đẩy nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.