Làm thế nào để chuyển đổi một kho lưu trữ Git bình thường sang một kho lưu trữ trần?


602

Làm cách nào tôi có thể chuyển đổi kho Git 'bình thường' sang kho lưu trữ trần?

Sự khác biệt chính dường như là:

  • trong kho Git bình thường, bạn có một .gitthư mục bên trong kho chứa tất cả dữ liệu liên quan và tất cả các tệp khác tạo thành bản sao làm việc của bạn

  • trong kho Git trống, không có bản sao hoạt động và thư mục (hãy gọi nó repo.git) chứa dữ liệu kho lưu trữ thực tế


16
Có lẽ đây là một phương pháp ngắn hơn:mv repo/.git repo.git; rm -rf repo
jameshfisher

Vâng đúng. Khi tôi viết câu hỏi, đây chỉ là đoạn trích trong lịch sử của tôi, mà tôi đã thực hiện vào phút khác.
Boldewyn

54
@eegg Sử dụng &&thay vì ;trong trường hợp mvthất bại!

Câu trả lời:


609

Tóm lại: thay thế nội dung repobằng nội dung của repo/.git, sau đó báo cho kho lưu trữ rằng bây giờ nó là một kho lưu trữ trần.

Để thực hiện việc này, thực hiện các lệnh sau:

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

Lưu ý rằng điều này khác với việc thực hiện git clone --baređến một vị trí mới (xem bên dưới).


9
Cảm ơn các gợi ý tại core.bare. Bây giờ, sau khi googling tùy chọn này, tôi có thể xác nhận nó: kernel.org/pub/software/scm/git-core/docs/git-config.html
Boldewyn

14
Cảm ơn bạn! Điều này có vẻ sạch hơn đối với tôi: mv repo / .git repo.git && rm -rf repo && cd repo.git && git config --bool core.bare true
JasonWoust

56
Điều này quá phức tạp và mong manh hơn nhiều so với câu trả lời dưới đây ( git clone --bare /path/to/repo).
djd

7
rmLệnh đó có thể cần * \.[!.]*thay vì *để loại bỏ các tập tin dấu chấm và thư mục dấu chấm.
minopret

6
@Ciantic: Một lần nữa, như tôi đã giải thích trong nhận xét của mình ở trên, câu trả lời của tôi đã được đưa ra 3 năm trước, nhưng 5 tháng trước đã có người chỉnh sửa câu hỏi thành một điều hoàn toàn khác. Không có câu trả lời trên trang này sẽ ý nghĩa gì nữa. Chuỗi lệnh đó được sao chép trực tiếp từ câu hỏi, tôi chỉ cần thêm hai dòng cuối cùng.
Jörg W Mittag

244

Phương pháp của bạn có vẻ như nó sẽ hoạt động; cấu trúc tệp của một kho lưu trữ trần chỉ là những gì bên trong thư mục .git. Nhưng tôi không biết liệu có bất kỳ tệp nào thực sự thay đổi hay không, vì vậy nếu thất bại, bạn có thể làm

git clone --bare /path/to/repo

Có lẽ bạn sẽ cần phải làm điều đó trong một thư mục khác để tránh xung đột tên, và sau đó bạn có thể di chuyển nó trở lại nơi bạn muốn. Và bạn có thể cần phải thay đổi tệp cấu hình để trỏ đến bất cứ nơi nào repo gốc của bạn.


50
Sai, phương pháp này không tương đương. Thực hiện một bản sao không bảo toàn các tùy chọn cấu hình, điều này có thể rất quan trọng đối với hoạt động đúng, chẳng hạn như nếu bạn sử dụng git-p4. Ngoài ra, một bản sao sẽ phá hủy điều khiển từ xa, một lần nữa với thứ gì đó như git-p4, bạn sẽ mất nhánh p4 / master khi bạn sao chép, vì vậy cách tiếp cận trên là thích hợp hơn.
nosatalian

26
Nhưng bạn có thể chuyển các tùy chọn cấu hình dễ dàng bằng cách sao chép các phần tương ứng của tệp cấu hình. Tôi vẫn coi phương pháp này sạch hơn là sao chép và đổi tên tệp theo cách thủ công.
Philipp

6
Điều này là hoàn hảo sau khi di chuyển lật đổ vì git-svn thiếu hỗ trợ cho --bare.
Keyo

11
Để tránh xung đột tên ---git clone --bare /path/to/repo.git /path/to/newbarerepo.git
raksja

Điều này hoạt động miễn là bạn chạy git update-server-infotrên repo trần sau khi tạo.
ACK_stoverflow

116

Tôi nghĩ rằng liên kết sau đây sẽ hữu ích

GitFaq: Làm cách nào để tôi tạo kho lưu trữ không trống hiện có?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo

2
Vâng, đó là những gì tôi đã tìm kiếm, cảm ơn! Tuy nhiên, đề xuất thứ hai của họ ( git clone) có những nhược điểm mà nosatalian đã đề cập ở trên.
Boldewyn

1
Tài liệu mà bạn đề xuất tiếp tục nói, "Phương pháp an toàn hơn là để Git xử lý tất cả các cài đặt bên trong cho bạn bằng cách thực hiện một cái gì đó như thế này ... git clone --bare -l <path_to_Vpose> <new_dir>"
dafunker

74

Trừ khi bạn đặc biệt muốn hoặc cần phải xoay các bit trên hệ thống tập tin, thực sự rất đơn giản để tạo một phiên bản trống của kho lưu trữ không trống (được đề cập trong một số bài đăng khác ở đây). Đó là một phần của chức năng cốt lõi của git:

git clone --bare existing_repo_path bare_repo_path


6
Thật đáng ngạc nhiên khi câu trả lời hay nhất từ ​​xa có 0 phiếu sau> 4 tháng. "Câu trả lời được chấp nhận" không phải là rất tốt nhưng nguy hiểm có 200!
Ổn định

36
Không có gì đáng ngạc nhiên cả - câu trả lời này không làm được những gì câu hỏi ban đầu. Nó không chuyển đổi một repo, nó nhân bản một, mất thông tin trong quá trình (ví dụ, các chi nhánh từ xa).
GreenAsJade

15

Hãy cũng xem xét để sử dụng

git clone --mirror path_to_source_repository

Từ tài liệu :

Thiết lập một bản sao của kho lưu trữ nguồn. Điều này ngụ ý - giá trị. So với --bare, --mirror không chỉ ánh xạ các nhánh cục bộ của nguồn tới các nhánh cục bộ của mục tiêu, nó ánh xạ tất cả các ref (bao gồm các nhánh theo dõi từ xa, ghi chú, v.v.) và thiết lập cấu hình refspec sao cho tất cả các ref này được ghi đè bằng cập nhật từ xa git trong kho đích.


Có vẻ như đây là cách ngắn gọn, đầy đủ và an toàn nhất để làm những gì OP muốn (so với chỉ clone). Tui bỏ lỡ điều gì vậy? Là --mirrormột bổ sung tương đối gần đây?
Craig Silver

@CraigSilver: Không, như tôi thấy trong lịch sử tài liệu ở dạng như vậy, --mirrornó có sẵn từ phiên bản 1.7, vì vậy đã khá dài. Bạn có thể xem tại đây
Jacek Krawchot

7

Tôi chỉ muốn đẩy đến một kho lưu trữ trên đường dẫn mạng nhưng git sẽ không cho phép tôi làm điều đó trừ khi kho lưu trữ đó được đánh dấu là trần. Tất cả tôi cần là thay đổi cấu hình của nó:

git config --bool core.bare true

Không cần phải nghịch ngợm với các tập tin trừ khi bạn muốn giữ sạch nó.


3
Điều này là nguy hiểm, khi bạn cũng muốn làm việc trên cây làm việc của repo từ xa. Rất có thể, sớm hay muộn bạn hoàn nguyên một thay đổi chỉ vì cây công việc từ xa và chỉ mục của bạn không đồng bộ với kho lưu trữ. Tôi không đề xuất giải pháp này, nếu bạn không biết chính xác những gì bạn đang làm.
Boldewyn

Đúng, bạn không nên làm việc trên cây của repo trần từ xa.
Slion

6

Tôi đã đọc câu trả lời và tôi đã làm điều này:

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like

cái này sẽ để lại nội dung repos/.gitnhư trầnrepos.git


4

Đây là những gì tôi nghĩ là an toàn và đơn giản nhất. Không có gì ở đây không được nêu ở trên. Tôi chỉ muốn xem một câu trả lời cho thấy một quy trình từng bước an toàn. Bạn bắt đầu một thư mục từ kho lưu trữ (repo) mà bạn muốn để trống. Tôi đã thông qua quy ước ngụ ý ở trên rằng các thư mục kho lưu trữ trần có phần mở rộng .git.

(1) Backup, just in case.
    (a) > mkdir backup
    (b) > cd backup
    (c) > git clone ../repo
(2) Make it bare, then move it
    (a) > cd ../repo
    (b) > git config --bool core.bare true
    (c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
    (a) > cd ..
    (b) > mkdir test
    (c) > cd test
    (d) > git clone ../repo.git
(4) Clean up
    (a) > rm -Rf repo
    (b) (optional) > rm -Rf backup/repo
    (c) (optional) > rm -Rf test/repo

1
điều này thực sự không an toàn hơn nhiều vì bạn đã tạo bản sao lưu của mình bằng git clone. Sao lưu bằng cách nhân bản sẽ khiến bạn mất một số cấu hình, trong một số trường hợp nhất định có thể rất quan trọng đối với kho lưu trữ.
Nói dối Ryan

Lưu ý Các cấu hình duy nhất tôi từng quan tâm là toàn cầu cho tất cả các kho lưu trữ cục bộ của tôi.
sdesciencelover

4

Chỉ cần đọc

Pro Git Book: 4.2 Git trên máy chủ - Bắt Git trên máy chủ

mà đi xuống

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

Sau đó đặt my_project.git vào máy chủ

Mà chủ yếu là, câu trả lời # 42 đã cố gắng chỉ ra. Một cách an toàn có thể phát minh lại bánh xe ;-)


Tôi không thấy, những gì câu trả lời này thêm vào, điều đó đã không được thảo luận về độ dài tùy ý trong bất kỳ câu trả lời nào khác xung quanh (bao gồm cả câu trả lời). Ông có thể làm rõ? (By the way: Pro Git Sách nói “Đây là tương đương với một cái gì đó giống như ...” , và rằng tương đương chính xác thô cũng đã thảo luận ở đây.)
Boldewyn

3

Đây là một hàm BASH nhỏ mà bạn có thể thêm vào .bashrc hoặc .profile trên hệ thống dựa trên UNIX. Sau khi thêm và shell được khởi động lại hoặc tệp được tải lại thông qua một cuộc gọi đến source ~/.profilehoặc source ~/.bashrc.

function gitToBare() {
  if [ -d ".git" ]; then
    DIR="`pwd`"
    mv .git ..
    rm -fr *
    mv ../.git .
    mv .git/* .
    rmdir .git

    git config --bool core.bare true
    cd ..
    mv "${DIR}" "${DIR}.git"

    printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
    printf "bare and renamed to\n  ${DIR}.git\n"
    cd "${DIR}.git"
  else
    printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
  fi
}

Khi được gọi trong một thư mục chứa thư mục .git, nó sẽ thực hiện các thay đổi thích hợp để chuyển đổi kho lưu trữ. Nếu không có thư mục .git hiện diện khi được gọi, thông báo FAILURE sẽ xuất hiện và không có thay đổi hệ thống tệp nào xảy ra.


1

Các phương thức nói để loại bỏ các tệp và muck về việc di chuyển thư mục .git không sạch và không sử dụng phương pháp "git" để làm một việc gì đó đơn giản. Đây là phương pháp sạch nhất tôi đã tìm thấy để chuyển đổi một repo bình thường thành một repo trần.

Bản sao đầu tiên / đường dẫn / đến / bình thường / repo thành một repo trần gọi là repo.git

git clone --bare /path/to/normal/repo

Tiếp theo xóa nguồn gốc trỏ đến / path / to / normal / repo

cd repo.git
git remote rm origin

Cuối cùng, bạn có thể loại bỏ repo ban đầu của bạn. Bạn có thể đổi tên repo.git thành repo tại thời điểm đó, nhưng quy ước chuẩn để biểu thị một kho lưu trữ git là một cái gì đó. Vì vậy, cá nhân tôi sẽ để nó theo cách đó.

Khi bạn đã thực hiện tất cả những điều đó, bạn có thể sao chép repo trần mới của mình (điều này thực sự tạo ra một repo bình thường và cũng là cách bạn sẽ chuyển đổi nó từ trần sang bình thường)

Tất nhiên, nếu bạn có các dòng ngược dòng khác, bạn sẽ muốn ghi chú về chúng và cập nhật repo trần của bạn để đưa nó vào. Nhưng một lần nữa, tất cả có thể được thực hiện với lệnh git. Hãy nhớ các trang người đàn ông là bạn của bạn.


1
Bạn có bận tâm để đọc các câu trả lời khác? Đặc biệt là bình luận của @ jonescb và @ nosatalian cho nó? Phương pháp "git" là thế này: "Làm nhiều nhất có thể với các tệp văn bản thuần túy". Bạn nên bắt đầu điều tra các phần bên trong của một .gitthư mục. Nó mang tính giáo dục cao để học hỏi, làm thế nào các bộ phận khớp với nhau.
Boldewyn

1

Trong trường hợp bạn có một kho lưu trữ với một vài nhánh / refs / Heads / * kiểm tra cục bộ và một vài nhánh nhánh từ xa từ xa / origin / * VÀ nếu bạn muốn chuyển đổi nó thành kho lưu trữ BARE với tất cả các nhánh trong / refs / Heads / *

bạn có thể làm như sau để lưu lại lịch sử.

  1. tạo một kho lưu trữ trần
  2. cd vào kho lưu trữ cục bộ có các nhánh thanh toán cục bộ và các nhánh từ xa
  3. git đẩy / đường dẫn / đến / trần / repo + refs / điều khiển từ xa / nguồn gốc / : refs / Heads /

0

Tôi đã sử dụng tập lệnh sau để đọc tệp văn bản có danh sách tất cả các repos SVN của tôi và chuyển đổi chúng thành GIT, và sau đó sử dụng git clone --bare để chuyển đổi thành repo git trần

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name 
 sudo git clone --bare /programs/git/$repo_name $repo_name.git
 sudo chown -R www-data:www-data $repo_name.git
 sudo rm -rf $repo_name
done <"$file"

list.txt có định dạng

repo1_name
repo2_name

và users.txt có định dạng

(no author) = Prince Rogers <prince.rogers.nelson@payesley.park.org>

Dữ liệu www là người dùng máy chủ web Apache, cần có sự cho phép để đẩy các thay đổi qua HTTP


0

Dưới đây là định nghĩa của một kho lưu trữ trần từ gitglossary :

Một kho lưu trữ trần thường là một thư mục có tên thích hợp với hậu tố .git không có bản sao kiểm tra cục bộ của bất kỳ tệp nào trong kiểm soát sửa đổi. Đó là, tất cả các tệp quản trị và kiểm soát Git thường có trong thư mục con .git ẩn được trình bày trực tiếp trong thư mục repository.git và không có tệp nào khác xuất hiện và kiểm tra. Thông thường các nhà xuất bản của kho lưu trữ công cộng làm cho kho lưu trữ trần có sẵn.

Tôi đến đây vì tôi đang chơi xung quanh với một "kho lưu trữ cục bộ" và muốn có thể làm bất cứ điều gì tôi muốn như thể đó là một kho lưu trữ từ xa. Tôi chỉ chơi xung quanh, cố gắng tìm hiểu về git. Tôi sẽ cho rằng đây là tình huống cho bất cứ ai muốn đọc câu trả lời này.

Tôi rất thích cho một ý kiến chuyên gia hoặc một số cụ thể phản ví dụ, tuy nhiên có vẻ như đó (sau khi lục lọi một số mã nguồn git mà tôi tìm thấy) chỉ đơn giản là đi đến tập tin .git/configvà thiết lập các lõi thuộc tính trần để đúng , git sẽ cho phép bạn làm bất cứ điều gì bạn muốn làm với kho lưu trữ từ xa. Tức là các dòng sau nên tồn tại trong .git/config:

[core]
    ...
    bare = true
...

(Đây là khoảng những gì lệnh git config --bool core.bare true sẽ làm, có lẽ được khuyến nghị để xử lý các tình huống phức tạp hơn)

Lời biện minh của tôi cho khiếu nại này là, trong mã nguồn git, dường như có hai cách kiểm tra khác nhau nếu một repo trống hay không. Một là bằng cách kiểm tra một biến toàn cục is_bare_repository_cfg. Điều này được đặt trong một số giai đoạn thiết lập thực hiện và phản ánh giá trị tìm thấy trong .git/configtệp. Cái khác là một chức năng is_bare_repository(). Dưới đây là định nghĩa của chức năng này:

int is_bare_repository(void)
{
    /* if core.bare is not 'false', let's see if there is a work tree */
    return is_bare_repository_cfg && !get_git_work_tree();
} 

Tôi không đã lần cũng không chuyên môn để nói điều này với sự tự tin tuyệt đối, nhưng như xa như tôi có thể nói nếu bạn có barethiết lập thuộc tính truetrong .git/config, điều này luôn luôn phải trả lại 1. Phần còn lại của chức năng có thể dành cho tình huống sau:

  1. core.bare không xác định (nghĩa là không đúng cũng không sai)
  2. Không có worktree (tức là thư mục con .git là thư mục chính)

Tôi sẽ thử nghiệm nó khi tôi có thể sau này, nhưng điều này dường như cho thấy rằng thiết lập core.bare = true tương đương với việc loại bỏ core.bare khỏi tệp cấu hình và thiết lập các thư mục đúng cách.

Ở bất kỳ giá nào, việc đặt core.bare = true chắc chắn sẽ cho phép bạn đẩy mạnh vào nó, nhưng tôi không chắc liệu sự hiện diện của các tệp dự án có khiến một số hoạt động khác bị sai lệch hay không. Thật thú vị và tôi cho rằng hướng dẫn để đẩy vào kho lưu trữ và xem những gì đã xảy ra cục bộ (tức là chạy git statusvà hiểu kết quả).


-1

Đầu tiên, backuprepo hiện tại của bạn:

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

Thứ hai, chạy như sau:

git clone --bare -l non_bare_repo new_bare_repo

Bản sao trung gian để làm gì?
Stablesog

-4

Oneliner để thực hiện tất cả các hoạt động trên:

for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true

(đừng đổ lỗi cho tôi nếu có thứ gì đó nổ tung và bạn không có bản sao lưu: P)


-9

Wow, thật đáng kinh ngạc khi có nhiều người theo đuổi điều này, đặc biệt là xem xét có vẻ như không một người nào dừng lại để hỏi tại sao người này lại làm những gì anh ta đang làm.

Sự khác biệt DUY NHẤT giữa kho lưu trữ git trần và không trần là phiên bản không trần có bản sao hoạt động. Lý do chính bạn sẽ cần một repo trần là nếu bạn muốn cung cấp nó cho bên thứ ba, bạn thực sự không thể làm việc trực tiếp với nó vì vậy đến một lúc nào đó bạn sẽ phải sao chép nó vào thời điểm bạn trở lại một phiên bản sao chép làm việc thông thường.

Điều đó đang được nói, để chuyển đổi sang một repo trần, tất cả những gì bạn phải làm là đảm bảo rằng bạn không có cam kết nào đang chờ xử lý và sau đó chỉ là:

rm -R * && mv .git/* . && rm -R .git

Có ya đi, repo trần.


11
Điều này sẽ không làm cho nó đủ trần. Hãy thử đẩy vào nó. Bạn cần phải làm git config core.bare truenhư là tốt.
Antony Hatchkins

Tôi đã không downvote, nhưng tôi chỉ muốn chỉ ra rằng phần đầu tiên của câu trả lời này giải thích lý do tại sao bạn muốn một repo trần so với một người không trần là ok , mặc dù nó không chứa đủ chi tiết kỹ thuật, và có thể hơi không chính xác. Tuy nhiên , đối với phần 2 của câu trả lời của bạn, trong khi các lệnh đó thiết lập repo của bạn ở trạng thái trống, Anthony đã đúng , bạn vẫn cần phải đặt git config core.bare true, giống như trong câu trả lời này .
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.