Sử dụng Git và Dropbox cùng nhau có hiệu quả?


1133

Làm cách nào để sử dụng GitDropbox cùng nhau một cách hiệu quả?



39
Nếu bạn chỉ là một nhóm nhỏ (tối đa 5 tôi nghĩ), thì BitBucket cung cấp dịch vụ lưu trữ miễn phí cho các kho riêng. Trớ trêu thay, sau đó tôi có repo cục bộ của mình trên DropBox, chỉ trong trường hợp tôi di chuyển giữa các máy tính khi tôi đang làm việc gì đó.
Đánh dấu Adamson

12
Tôi không chắc chắn rằng sự dư thừa phiên bản của bạn là mỉa mai, nhưng nó có thể khá hữu ích
silasdavis

2
Câu hỏi này không rõ ràng. Việc sử dụng các công cụ này cùng nhau "có hiệu quả" nghĩa là gì? Nó cũng quá rộng và có khả năng tạo ra các câu trả lời có ý kiến.

3
Xin chào, bạn có thể xem câu trả lời của tôi là câu trả lời đúng không: stackoverflow.com/a/32215708/589667 . Thư viện này tôi đề cập trong câu trả lời của tôi là một công cụ chính thức được xây dựng bởi các nhà phát triển dropbox để giúp mọi người sử dụng Git với Dropbox.
clu

Câu trả lời:


1401

Tôi nghĩ rằng Git trên Dropbox là tuyệt vời. Tôi sử dụng tất cả thời gian. Tôi có nhiều máy tính (hai ở nhà và một ở nơi làm việc) mà tôi sử dụng Dropbox làm kho lưu trữ trung tâm. Vì tôi không muốn lưu trữ nó trên một dịch vụ công cộng và tôi không có quyền truy cập vào một máy chủ mà tôi luôn có thể ssh đến, Dropbox xử lý việc này bằng cách đồng bộ hóa (rất nhanh) trong nền.

Thiết lập là một cái gì đó như thế này:

~/project $ git init
~/project $ git add .
~/project $ git commit -m "first commit"
~/project $ cd ~/Dropbox/git

~/Dropbox/git $ git init --bare project.git
~/Dropbox/git $ cd ~/project

~/project $ git remote add origin ~/Dropbox/git/project.git
~/project $ git push -u origin master

Từ đó, bạn có thể sao chép ~/Dropbox/git/project.gitrằng bạn đã liên kết với tài khoản Dropbox của mình (hoặc đã chia sẻ thư mục này với mọi người), bạn có thể thực hiện tất cả các hoạt động Git bình thường và chúng sẽ được tự động đồng bộ hóa với tất cả các máy khác của bạn.

Tôi đã viết một bài đăng trên blog, On Version Control , ( liên kết cũ đã chết ) về lý do của tôi và cách tôi thiết lập môi trường của mình, nó dựa trên kinh nghiệm phát triển Ruby on Rails của tôi , nhưng thực sự nó có thể được áp dụng cho mọi thứ.


61
Tôi tự hỏi điều gì sẽ xảy ra nếu bạn đẩy repo trần từ hai máy cùng một lúc. Nếu nó sẽ gây ra sửa đổi trong một trong các tệp nội bộ của git, dropbox sẽ cho bạn thấy có xung đột - nhưng sau đó bạn sẽ làm gì? Chỉ cần chọn một trong các phiên bản, và sau đó đẩy lại từ cả hai máy (từng cái một)?
dubek

162
@dubek: Có thể bạn sẽ làm hỏng repo trần được chia sẻ. Cách tiếp cận này chỉ phù hợp với một nhóm nhỏ (hai người trong trường hợp của tôi), nơi mọi người chỉ có thể hét lên trên các bức tường hình khối của họ: "Này! Không ai đẩy! Tôi đang đẩy ngay bây giờ!".
Ates Goral

50
@Ates: Ít nhất git là phi tập trung, vì vậy nếu bạn quản lý để làm hỏng những thứ bạn có thể khôi phục nó từ bản sao cục bộ của ai đó. Nếu bạn có một đội ngũ lớn, rất có thể có đủ tiền mặt cho một repo được lưu trữ ở đâu đó.
ndrey

75
Tôi đã quay lại trang này hơn năm lần để sử dụng chuỗi lệnh chính xác này. Tôi sẽ không bao giờ ghi nhớ chúng, nhưng cảm ơn vì đã cung cấp chúng!
Jeremy Mack

32
@Jo: Nó không đủ ghetto.
Ates Goral

128

Cách đúng đắn để làm điều này là sử dụng git-remote-dropbox: https://github.com/ biếnathalye / git-remote-dropbox

Tạo repo trần của riêng bạn trong Dropbox gây ra rất nhiều vấn đề. Anish (người tạo ra thư viện) giải thích điều đó tốt nhất :

Nguyên nhân sâu xa của những vấn đề này là máy khách máy tính để bàn Dropbox được thiết kế để đồng bộ hóa các tệp chứ không phải kho lưu trữ Git. Nếu không xử lý đặc biệt cho kho Git, nó không duy trì các đảm bảo giống như Git. Các hoạt động trên kho lưu trữ từ xa không còn là nguyên tử và các hoạt động đồng thời hoặc thời gian không may mắn với đồng bộ hóa có thể dẫn đến một kho lưu trữ bị hỏng.

Git truyền thống từ xa chạy mã ở phía máy chủ để làm cho công việc này hoạt động chính xác, nhưng chúng ta không thể làm điều đó.

Giải pháp: Có thể giải quyết điều này đúng. Có thể sử dụng Git với Dropbox và có cùng đảm bảo an toàn và nhất quán như một điều khiển từ xa Git truyền thống, ngay cả khi có nhiều người dùng và hoạt động đồng thời!

Đối với người dùng, đơn giản như sử dụng git-remote-dropbox, trình trợ giúp từ xa Git hoạt động như một cầu nối hai chiều trong suốt giữa Git và Dropbox và duy trì tất cả các đảm bảo của điều khiển từ xa Git truyền thống. Nó thậm chí còn an toàn để sử dụng với các thư mục được chia sẻ, vì vậy nó có thể được sử dụng để cộng tác (yay repos riêng không giới hạn với cộng tác viên không giới hạn!).

Với trình trợ giúp từ xa, có thể sử dụng Dropbox làm điều khiển từ xa Git và tiếp tục sử dụng tất cả các lệnh Git thông thường như git clone, git pull và git đẩy, và mọi thứ sẽ hoạt động như mong đợi.


8
Tôi rất vui khi thấy ai đó đã đăng bài về git-remote-dropbox trong câu hỏi StackOverflow này. Tôi tự hỏi liệu có cách nào để đưa phản hồi này đến gần hơn không. Phương pháp được đề xuất bởi câu trả lời được chấp nhận hiện tại là khá nguy hiểm và có thể dẫn đến tham nhũng kho lưu trữ.
fwenom

1
Điều đó thật tuyệt. Tôi nhất định sẽ kiểm tra. nhưng khi tôi chuyển từ hộp dev này sang hộp dev khác và muốn tiếp tục làm việc với repo đã đồng bộ hóa, phương thức này sẽ chỉ hoạt động nếu tôi luôn cam kết công việc của mình khi rời khỏi máy A và muốn chọn nơi tôi rời đi máy B. tôi có đúng không? nếu vậy, điều này không lý tưởng, vì nó sẽ dẫn đến một loạt các cam kết "tạm thời", mà người ta có thể tranh luận sẽ làm ô nhiễm lịch sử cam kết của repo. có lẽ tôi không thể có bánh của tôi và ăn nó quá!
bhu Boue vidya

@bhuBouevidya Không, điều đó không đúng. Bạn không cần phải cam kết công việc của mình cho những thay đổi được đồng bộ hóa. Miễn là các tệp được lưu, các tệp sẽ được đồng bộ hóa. Về cơ bản nếu bạn có một loạt các tệp được sửa đổi trên một máy, các sửa đổi sẽ đồng bộ hóa với máy khác vì Dropbox chỉ quan tâm đến những gì đã được lưu vào đĩa.
clu

2
@clu: Có bạn phải cam kết công việc của bạn và đẩy. Tất cả những gì git-remote-dropbox làm là hoạt động như một trình trợ giúp từ xa git. Cũng giống như các điều khiển từ xa khác, các cam kết cục bộ của bạn sẽ không bị đẩy ra điều khiển từ xa cho đến khi thực hiện xong việc đẩy. Cách để đưa các tệp được sửa đổi cục bộ vào kho lưu trữ cục bộ để có thể đẩy chúng là bằng cách thực hiện một cam kết. Dropbox sẽ không biết gì về các tệp của bạn không có trong kho lưu trữ.
Kiến

2
Chỉ tò mò nếu git-remote-dropbox là đa nền tảng ... Tôi thấy nó sử dụng python và tôi biết một số thứ python khác cho Dropbox không phải là đa nền tảng, ví dụ như trên OS X, công cụ dòng lệnh không tương thích.
Michael

89

Câu trả lời này dựa trên trải nghiệm Mercurial , không phải Git, nhưng trải nghiệm này cho biết sử dụng Dropbox theo cách này sẽ yêu cầu các kho lưu trữ bị hỏng nếu thậm chí có khả năng bạn sẽ cập nhật cùng một kho lưu trữ dựa trên Dropbox từ các máy khác nhau (Mac, Unix, Windows trong trường hợp của tôi).

Tôi không có một danh sách đầy đủ về những điều có thể sai, nhưng đây là một ví dụ cụ thể cắn tôi. Mỗi máy có khái niệm riêng về các ký tự kết thúc dòng và cách xử lý các ký tự chữ hoa / thường trong tên tệp. Dropbox và Git / Mercurial xử lý việc này hơi khác một chút (tôi không nhớ chính xác sự khác biệt). Nếu Dropbox cập nhật kho lưu trữ phía sau kho lưu trữ bị hỏng của Git / Mercurial. Điều này xảy ra ngay lập tức và vô hình, vì vậy bạn thậm chí không biết kho lưu trữ của mình bị hỏng cho đến khi bạn cố gắng khôi phục một cái gì đó từ nó.

Sau khi đào ra từ một mớ hỗn độn làm mọi thứ theo cách này, tôi đã sử dụng công thức sau đây rất thành công và không có dấu hiệu của vấn đề. Đơn giản chỉ cần di chuyển kho lưu trữ của bạn ra khỏi Dropbox. Sử dụng Dropbox cho mọi thứ khác; tài liệu, tập tin JAR , bất cứ điều gì bạn muốn. Và sử dụng GitHub (Git) hoặc Bitbucket (Mercurial) để quản lý kho lưu trữ. Cả hai đều miễn phí nên điều này không thêm gì vào chi phí, và mỗi công cụ hiện phát huy thế mạnh của nó.

Chạy Git / Mercurial trên Dropbox không thêm gì ngoại trừ rủi ro. Đừng làm điều đó.


13
Tôi cảm thấy rằng kho git đủ mạnh để không bị hỏng. Kinh nghiệm của tôi (hơn một năm sử dụng, chủ yếu là người dùng đơn, đa nền tảng, máy tính chéo, nhiều nhà phát triển), đó là repo của git không dễ bị hỏng. Trong git, chỉ có thông tin được thêm vào kho lưu trữ, các tệp hiện có chỉ còn lại 99,9% thời gian (các tệp có thể thay đổi hầu hết dễ dàng kiểm tra thủ công). Đôi khi tôi đã thấy các trường hợp con trỏ nhánh bị ghi đè, nhưng có thể dễ dàng nhìn thấy điều này (nghĩa là "nhánh (bản sao bị xung đột của XXX)") và thực sự không cần sửa chữa thực sự).
Egon

1
@tc: Bạn nói đúng, trong quá trình thu gom rác, thông tin không thể truy cập được xóa trong git. Tuy nhiên, tôi đoán rằng đối với hầu hết các trường hợp thực tế, điều này không gây hại cho tính mạnh mẽ: chỉ những thông tin không thể truy cập cũ hơn 2 tuần mới bị ảnh hưởng (đó là thời gian đủ để DropBox đồng bộ hóa). Và tại thời điểm của một cuộc xung đột như vậy, tôi nghi ngờ hầu hết các thông tin sẽ có sẵn ở cả dạng đóng gói và giải nén.
Egon

Tôi nghĩ rằng kịch bản chia sẻ mã không có repo trung tâm (được giải thích trong câu trả lời bên dưới) sẽ lưu một từ các lỗi có thể xảy ra do các cập nhật đồng thời vào thư mục trong dropbox. Nếu một người cần một repo trung tâm, nó có thể được quản lý riêng (và bên ngoài dropbox); dropbox sẽ giữ các repos làm việc cá nhân (cũng thuận tiện vì bạn có thể cập nhật / kéo theo thời gian từ repo nguồn của người khác trong nhóm của bạn mà bạn dựa vào công việc). (Tôi thực sự dự tính sử dụng darcs trong một khung cảnh như vậy.)
imz - Ivan Zakharyaschev

5
+1 Nếu bạn không muốn lưu trữ các kho lưu trữ của mình ở nơi công cộng, hãy sử dụng Bitbucket , các kho riêng tư miễn phí cho các nhóm tối đa 5 người dùng.
Christian Specht

Một điều tôi nhận thấy giữa máy Windows và máy OSX là quyền tệp có thể gây ra sự cố khác. Bạn có thể tắt quyền trong Git bằng cách sử dụng: "git config core.fileMode false"
devdrc

16

Liên quan đến các nhóm nhỏ sử dụng Dropbox:

Nếu mỗi nhà phát triển có kho lưu trữ trống có thể ghi của riêng họ trên Dropbox, chỉ dành cho các nhà phát triển khác, thì điều này tạo điều kiện chia sẻ mã mà không có nguy cơ tham nhũng!

Sau đó, nếu bạn muốn có một 'đường chính' tập trung, bạn có thể có một nhà phát triển quản lý tất cả các lần đẩy tới nó từ repo của riêng họ.


1
Tuyệt vời quá! Ngoài ra, để bảo vệ tham nhũng repo khỏi nhiều lần ghi, bạn có thể dễ dàng tạo ra NHIỀU repos và chỉ đồng bộ hóa các thư mục .git của họ! Tất cả bạn cần trong một khoảnh khắc - là để lấy từ nguồn gốc mong muốn! Người đàn ông P-to-P tuyệt vời! Bạn hiểu triết lý của git phi tập trung!
Brian Haak

16

Tôi không muốn đặt tất cả các dự án của mình dưới một kho lưu trữ Git, tôi cũng không muốn đi vào và chạy mã này cho mỗi dự án, vì vậy tôi đã tạo một tập lệnh Bash sẽ tự động hóa quy trình. Bạn có thể sử dụng nó trên một hoặc nhiều thư mục - vì vậy nó có thể thực hiện mã trong bài đăng này cho bạn hoặc nó có thể làm điều đó trên nhiều dự án cùng một lúc.

#!/bin/sh
# Script by Eli Delventhal
# Creates Git projects for file folders by making the origin Dropbox. You will need to install Dropbox for this to work.

# Not enough parameters, show help.
if [ $# -lt 1 ] ; then

cat<<HELP
projects_to_git.sh -- Takes a project folder and creates a Git repository for it on Dropbox

USAGE:
    ./projects_to_git.sh file1 file2 ..

EXAMPLES:
    ./projects_to_git.sh path/to/MyProjectDir
        Creates a git project called MyProjectDir on Dropbox

    ./projects_to_git.sh path/to/workspace/*
        Creates a git project on Dropbox for every folder contained within the workspace directory, where the project name matches the folder name

HELP
    exit 0
fi

# We have enough parameters, so let's actually do this thing.

START_DIR=$(pwd)

# Make sure we have a connection to Dropbox
cd ~
if [ -s 'Dropbox' ] ; then
    echo "Found Dropbox directory."
    cd Dropbox
    if [ -s 'git' ] ; then
        echo "    Dropbox Git directory found."
    else
        echo "    Dropbox Git directory created."
        mkdir git
    fi
else
    echo "You do not have a Dropbox folder at ~/Dropbox! Install Dropbox. Aborting..."
    exit 0
fi

# Process all directories matching the passed parameters.
echo "Starting processing for all files..."
for PROJ in $*
do
    if [ -d $PROJ ] ; then
        PROJNAME=$(basename $PROJ)
        echo "  Processing $PROJNAME..."

        # Enable Git with this project.
        cd $PROJ
        if [ -s '.git' ] ; then
            echo "    $PROJNAME is already a Git repository, ignoring..."
        else
            echo "    Initializing Git for $PROJNAME..."
            git init -q
            git add .
            git commit -m "Initial creation of project." -q

            # Make the origin Dropbox.

            cd ~/Dropbox/git
            if [ -s $PROJNAME ] ; then
                echo "    Warning! $PROJNAME already exists in Git! Ignoring..."
            else
                echo "    Putting $PROJNAME project on Dropbox..."
                mkdir $PROJNAME
                cd $PROJNAME
                git init -q --bare
            fi

            # Link the project to the origin
            echo "    Copying local $PROJNAME to Dropbox..."
            cd $PROJ
            git remote add origin "~/Dropbox/git/$PROJNAME"
            git push -q origin master
            git branch --set-upstream master origin/master
        fi
    fi
done

echo "Done processing all files."
cd $START_DIR

15

Tôi không nghĩ rằng sử dụng Git và Dropbox là cách tốt nhất ... Hãy nghĩ về các tính năng của cả hai:

Git:

  • Cho phép bạn có một kho lưu trữ trung tâm
  • Cho phép bạn có kho lưu trữ của riêng bạn với những thay đổi của riêng bạn
  • Cho phép bạn gửi và nhận các thay đổi từ kho lưu trữ trung tâm
  • Cho phép nhiều người thay đổi cùng một tệp và họ hợp nhất chúng hoặc yêu cầu bạn hợp nhất chúng nếu không thể thực hiện được
  • Có máy khách web và máy tính để bàn cho phép truy cập vào kho lưu trữ trung tâm

Dropbox:

  • Giữ mọi thứ trong một kho lưu trữ trung tâm
  • Cho phép bạn có phiên bản riêng của tệp trong máy chủ
  • Buộc bạn gửi và nhận các thay đổi từ kho lưu trữ trung tâm
  • Nếu nhiều người thay đổi cùng một tệp, tệp đầu tiên được cam kết sẽ được thay thế bằng các lần xác nhận sau và không xảy ra sự hợp nhất nào gây phiền hà (và chắc chắn là nhược điểm lớn nhất của nó)
  • Có máy khách web và máy tính để bàn để cho phép truy cập vào kho lưu trữ trung tâm.

Và nếu bạn lo lắng về việc chia sẻ một số tệp của mình, tại sao không giải mã chúng? Và sau đó bạn có thể nhận được lợi thế lớn nhất của Dropbox cho Git, đó là có các tệp công khai và riêng tư ...


Dropbox chỉ là một lựa chọn tốt cho một repo trung tâm. Nếu được đặt trong một thư mục chia sẻ, nó thậm chí hoạt động cho các nhóm.
mac

Có, nhưng bạn sẽ không có các tính năng hợp nhất như trong git, trên thực tế nếu ai đó đang chỉnh sửa cùng một tệp với bạn và anh ta sẽ lưu tệp sau khi bạn thay đổi, trừ khi bạn truy cập vào giao diện web và tải xuống phiên bản cũ (phiên bản của bạn).
Coyote21

8
Cái này sai. Dropbox không giảm xung đột. Nó xáo trộn tên tệp của một chỉnh sửa và sử dụng cái kia để liên tục. Bạn có thể tự hợp nhất chúng nếu bạn muốn. Đó là một sự thỏa hiệp tốt và không làm mất dữ liệu. dropbox.com/help/36
Cluless

5
Đúng nhưng vì đây là về mã, nên tôi càng dành ít thời gian để hợp nhất các tệp mà tôi có thể tạo ra nhiều mã hơn và trong một cơ sở mã thông thường, có thể xảy ra hàng trăm xung đột cùng một lúc, tùy thuộc vào kích thước dự án và sẽ là một cơn ác mộng đối với hợp nhất từng cái một, ngay cả với sự trợ giúp của một công cụ hợp nhất như WinMerge (hoặc một cái gì đó tương tự).
Coyote21

15

Bây giờ là năm 2015 và tính đến ba ngày trước, một công cụ mới dựa trên Dropbox API v2 đã được tạo để sử dụng git trên Dropbox một cách an toàn. Nó hoạt động dựa trên API thay vì sử dụng máy khách để bàn và xử lý chính xác nhiều lần đẩy đồng thời vào kho lưu trữ được lưu trữ trong một thư mục dùng chung.

Sau khi được cấu hình, nó cho phép một người thiết lập một điều khiển từ xa chính xác như mọi điều khiển từ xa khác.

git clone "dropbox::/path/to/repo"
git remote add origin "dropbox::/path/to/repo"

2
Sẽ thật tuyệt nếu một số mod sẽ hợp nhất tất cả các câu hỏi git-with-dropbox trên stackexchange dưới một siêu phẩm đề cập đến những thứ mới nhất trước tiên.
Blair Houghton

9

Tôi sử dụng Mercurial (hoặc Git) + TrueCrypt + Dropbox để sao lưu từ xa được mã hóa .

Điều thú vị nhất là Dropbox KHÔNG đồng bộ hóa toàn bộ bộ chứa TrueCrypt nếu bạn sửa đổi một phần nhỏ mã của mình. Thời gian đồng bộ hóa tỷ lệ thuận với số lượng thay đổi. Mặc dù được mã hóa, sự kết hợp giữa TrueCrypt + Dropbox giúp sử dụng tuyệt vời mã hóa khối + đồng bộ hóa cấp khối.

Thứ hai, một container được mã hóa nguyên khối không chỉ tăng thêm bảo mật, nó còn làm giảm cơ hội tham nhũng kho lưu trữ .

Thận trọng: Tuy nhiên, bạn phải rất cẩn thận về việc không có thùng chứa được gắn trong khi Dropbox đang chạy. Nó cũng có thể là một nỗi đau để giải quyết xung đột nếu 2 khách hàng khác nhau đăng ký các phiên bản khác nhau vào container. Vì vậy, nó chỉ thực tế đối với một người sử dụng nó để sao lưu chứ không phải cho một nhóm.

Thiết lập:

  • Tạo một thùng chứa Truecrypt (nhiều Gigabyte là tốt)
  • Trong tùy chọn Truecrypt, bỏ chọn preserve modification timestamp*.
  • Tạo một repo như đã đề cập ở trên bởi Dan ( https://stackoverflow.com/a/1961515/781695 )

Sử dụng:

  • Thoát khỏi Dropbox
  • Gắn container, đẩy các thay đổi của bạn, ngắt kết nối
  • Chạy dropbox

PS Bỏ chọn preserve modification timestamphộp thư thông báo rằng tệp đã được sửa đổi và tệp sẽ được đồng bộ hóa. Lưu ý rằng việc gắn bộ chứa sẽ sửa đổi dấu thời gian ngay cả khi bạn không thay đổi bất kỳ tệp nào trong đó. Nếu bạn không muốn điều đó xảy ra, chỉ cần gắn âm lượng làread-only


Sẽ khác nhiều nếu sử dụng hình ảnh tệp .dmg được mã hóa của macos , liệu thời gian đồng bộ hóa có còn tỷ lệ thuận với các thay đổi không?
IBrum

@IBrum Xin lỗi, tôi đã không thử nó với tệp .dmg
người dùng

7

Tôi thích câu trả lời của Dan McNevin! Bây giờ tôi cũng đang sử dụng Git và Dropbox và tôi đang sử dụng một số bí danh trong .bash_profile để quy trình làm việc của tôi giống như sau:

~/project $ git init
~/project $ git add .
~/project $ gcam "first commit"
~/project $ git-dropbox

Đây là những bí danh của tôi:

alias gcam='git commit -a -m'
alias gpom='git push origin master'
alias gra='git remote add origin'
alias git-dropbox='TMPGP=~/Dropbox/git/$(pwd | awk -F/ '\''{print $NF}'\'').git;mkdir -p $TMPGP && (cd $TMPGP; git init --bare) && gra $TMPGP && gpom'

Tôi có lẽ sẽ không sử dụng điều cuối cùng như một bí danh, thay vào đó là một kịch bản shell. Nếu không, tôi rất thích điều này. Tín dụng thêm cho việc sử dụng awk.
pauljohn32

6

Chúng tôi sử dụng phương pháp này (tạo một kho lưu trữ trần trong Dropbox) trên thư mục chia sẻ .

Một nhóm nhỏ các nhà phát triển có thể lấy từ kho lưu trữ được đồng bộ hóa trần đó và tạo một bản sao cục bộ. Sau khi đơn vị công việc được thực hiện, chúng tôi đẩy trở lại nguồn gốc.

Một điều tôi thiếu là một cách tốt để gửi e-mail với thông tin được đặt thay đổi sau khi xảy ra việc đẩy nguồn gốc. Chúng tôi đang sử dụng Google Wave để theo dõi các thay đổi theo cách thủ công.


81
Ai đó đang sử dụng Google Wave?
Kristopher Johnson

6

Tôi đã sử dụng Mercurial theo cách được khuyến nghị và khuyến cáo rằng bạn nên thận trọng, đặc biệt nếu có bất kỳ máy nào khác nhau. Các fora Dropbox có đầy đủ các khiếu nại về các vấn đề trường hợp tên tập tin bí ẩn xuất hiện tự phát. Hg (và tôi đoán Git) sẽ không thông báo hoặc khiếu nại trong các lần kiểm tra định kỳ và bạn sẽ chỉ nghe về tham nhũng khi nó phàn nàn về một repo tham nhũng khi bạn cố gắng sử dụng nó thực sự. Tin xấu. Ước gì tôi có thể cụ thể hơn về vấn đề và cách giải quyết của nó; Tôi vẫn đang cố gắng tự đào ra khỏi mớ hỗn độn này.


Tôi gặp vấn đề tương tự với đồng bóng
Tomba

git làm nhiều việc kiểm tra tham nhũng hơn những người khác theo thiết kế. Vì vậy, ít nhất bạn sẽ biết khi điều đó xảy ra và có thể khắc phục vấn đề.
Anders

6

Ngoài ra còn có một dự án nguồn mở (một tập hợp các tập lệnh đa nền tảng [Linux, Mac, Win]) thực hiện tất cả các chi tiết khó hiểu về quản lý kho lưu trữ với một số lệnh (3-4).

https://github.com/karalabe/gitbox/wiki

Sử dụng mẫu là:

$ gitbox create myapp
Creating empty repository...
Initializing new repository...
Repository successfully created.

$ gitbox clone myapp
Cloning repository...
Repository successfully cloned.

Sau đó sử dụng git bình thường:

$ echo “Some change” > somefile.txt
$ git add somefile.txt
$ git commit –m “Created some file”
$ git push

Kiểm tra wiki dự án và các hướng dẫn để tham khảo và hướng dẫn lệnh đầy đủ.


4

Tôi lưu trữ repo không phải Github của tôi trên Dropbox. Một cảnh báo tôi gặp phải là đồng bộ hóa sau khi cài đặt lại. Dropbox sẽ tải xuống các tệp nhỏ nhất trước khi chuyển sang các tệp lớn hơn. Không thành vấn đề nếu bạn bắt đầu vào ban đêm và quay lại sau cuối tuần :-)

Chủ đề của tôi - http://forums.dropbox.com/topic.php?id=29984&replies=6


4

Bây giờ vào năm 2014, tôi đã sử dụng Git và Dropbox trong khoảng một năm rưỡi mà không gặp vấn đề gì. Một số điểm mặc dù:

  • Tất cả các máy của tôi sử dụng Dropbox đều có trên Windows, các phiên bản khác nhau (7 đến 8) + 1 mac.
  • Tôi không chia sẻ kho lưu trữ với người khác, vì vậy tôi là người duy nhất sửa đổi nó.
  • git push đẩy đến một kho lưu trữ từ xa, để nếu nó bị hỏng, tôi có thể dễ dàng khôi phục nó.
  • Tôi đã phải tạo bí danh trong C:\Usersvới mklink /D link targetvì một số thư viện đã được chỉ đến các địa điểm tuyệt đối.

3

Tôi thích câu trả lời được bình chọn hàng đầu của Dan McNevin. Cuối cùng tôi đã thực hiện chuỗi lệnh git quá nhiều lần và quyết định tạo một kịch bản. Vì vậy, đây là:

#!/bin/bash

# Usage
usage() {
    echo "Usage: ${0} -m [ master-branch-directory ] -r [ remote-branch-directory ] [ project-name ]"
    exit 1
}

# Defaults
defaults() {
    masterdir="${HOME}/Dropbox/git"
    remotedir="${PWD}"
    gitignorefile="# OS generated files #\n\n.DS_Store\n.DS_Store?\n.Spotlight-V100\n.Trashes\nehthumbs.db\nThumbs.db"
}

# Check if no arguments
if [ ${#} -eq 0 ] ; then
    echo "Error: No arguments specified"
    usage
fi

#Set defaults
defaults

# Parse arguments
while [ ${#} -ge 1 ]; do
    case "${1}" in
        '-h' | '--help' ) usage ;;
        '-m' )
            shift
            masterdir="${1}"
            ;;
        '-r' )
            shift
            remotedir="${1}"
            ;;
        * )
            projectname="${1##*/}"
            projectname="${projectname%.git}.git"
            ;;
    esac
    shift
done

# check if specified directories and project name exists
if [ -z "${projectname}" ]; then
    echo "Error: Project name not specified"
    usage
fi

if [ ! -d "${remotedir}" ]; then
    echo "Error: Remote directory ${remotedir} does not exist"
    usage
fi

if [ ! -d "${masterdir}" ]; then
    echo "Error: Master directory ${masterdir} does not exist"
    usage
fi

#absolute paths
remotedir="`( cd \"${remotedir}\" && pwd )`"
masterdir="`( cd \"${masterdir}\" && pwd )`"

#Make master git repository
cd "${masterdir}"
git init --bare "${projectname}"

#make local repository and push to master
cd "${remotedir}"
echo -e "${gitignorefile}" > .gitignore # default .gitignore file
git init
git add .
git commit -m "first commit"
git remote add origin "${masterdir}/${projectname}"
git push -u origin master

#done
echo "----- Locations -----"
echo "Remote branch location: ${remotedir}"
echo "Master branch location: ${masterdir}"
echo "Project Name: ${projectname}"

Kịch bản chỉ yêu cầu một tên dự án. Nó sẽ tạo ra một kho lưu trữ git trong ~/Dropbox/git/tên được chỉ định và sẽ đẩy toàn bộ nội dung của thư mục hiện tại đến nhánh gốc gốc mới được tạo. Nếu có nhiều tên dự án được đưa ra, đối số tên dự án bên phải nhất sẽ được sử dụng.

Tùy chọn, đối số lệnh -r chỉ định nhánh từ xa sẽ đẩy đến bản gốc. Vị trí của chủ gốc dự án cũng có thể được chỉ định với đối số -m. Một tập tin .gitignore mặc định cũng được đặt trong thư mục nhánh từ xa. Mặc định thư mục và tệp .gitignore được chỉ định trong tập lệnh.


3

Cách tiếp cận khác:

Tất cả các câu trả lời cho đến nay, bao gồm câu trả lời @Dan phổ biến nhất, giải quyết ý tưởng sử dụng Dropbox để tập trung vào kho lưu trữ được chia sẻ thay vì sử dụng dịch vụ tập trung vào git như github, bitbucket, v.v.

Nhưng, vì câu hỏi ban đầu không chỉ định sử dụng "Git và Dropbox cùng nhau một cách hiệu quả" thực sự có nghĩa là gì, chúng ta hãy làm việc theo một cách tiếp cận khác: "Sử dụng Dropbox để chỉ đồng bộ hóa bàn làm việc".

Cách thực hiện có các bước sau:

  1. Trong thư mục dự án, người ta tạo một .gitthư mục trống (ví dụ mkdir -p myproject/.git)

  2. hủy đồng bộ .gitthư mục trong Dropbox. Nếu sử dụng Ứng dụng Dropbox: đi tới Tùy chọn, Đồng bộ hóa và "chọn thư mục để đồng bộ hóa", trong đó .gitthư mục cần được đánh dấu. Điều này sẽ loại bỏ các .gitthư mục.

  3. chạy git inittrong thư mục dự án

Nó cũng hoạt động nếu .gitđã tồn tại, sau đó chỉ thực hiện bước 2. Dropbox sẽ giữ một bản sao của các tệp git trong trang web.

Bước 2 sẽ khiến Dropbox không đồng bộ cấu trúc hệ thống git, đây là kết quả mong muốn cho phương pháp này.

Tại sao người ta sẽ sử dụng phương pháp này?

  • Các thay đổi chưa được đẩy sẽ có bản sao lưu Dropbox và chúng sẽ được đồng bộ hóa trên các thiết bị.

  • Trong trường hợp Dropbox bắt vít một cái gì đó khi đồng bộ hóa giữa các thiết bị git statusgit diffsẽ thuận tiện để sắp xếp mọi thứ.

  • Nó tiết kiệm không gian trong tài khoản Dropbox (toàn bộ lịch sử sẽ không được lưu trữ ở đó)

  • Nó tránh các mối quan tâm của @dubek và @Ates trong các nhận xét về câu trả lời của @ Dan và các mối quan tâm của @clu trong một câu trả lời khác .

Sự tồn tại của một điều khiển từ xa ở một nơi khác (github, v.v.) sẽ hoạt động tốt với phương pháp này.

Làm việc trên các ngành khác nhau mang lại một số vấn đề, cần được quan tâm:

  • Một vấn đề tiềm ẩn là có Dropbox (không cần thiết?) Đồng bộ hóa nhiều tệp có khả năng khi kiểm tra các nhánh khác nhau.

  • Nếu hai hoặc nhiều thiết bị được đồng bộ hóa Dropbox có các nhánh khác nhau được kiểm tra, các thay đổi không được cam kết cho cả hai thiết bị có thể bị mất,

Một cách xung quanh những vấn đề này là sử dụng git worktreeđể giữ kiểm tra chi nhánh trong các thư mục riêng biệt.


Là một người đang làm việc trên các tệp mà việc kiểm soát phiên bản sẽ rất tốt, nhưng cũng có thể chỉnh sửa trên iPad (thông qua đồng bộ hóa Dropbox), câu trả lời này bao gồm trường hợp sử dụng đó.
Vagari

Theo dõi nhanh, hành vi Dropbox hiện tại là khác nhau. Chỉ cần xóa và yêu cầu Dropbox không đồng bộ hóa có nghĩa là ngược lại, ở trong đám mây, xóa khỏi cục bộ. Nhưng có một câu trả lời siêu người dùng với một giải pháp. superuser.com/a/1527145/109561 Trong trường hợp của tôi (trên Mac), cờ sau đây sẽ bỏ qua tệp xattr -w com.dropbox.ignored 1 /path/to/somewhere.
Vagari

3

Đối với Dropbox 2 xu của tôi, chỉ có ý nghĩa cho việc sử dụng cá nhân mà bạn không muốn làm phiền một máy chủ repo trung tâm. Đối với bất kỳ sự phát triển chuyên nghiệp nào, có thể bạn sẽ tạo ra nhiều vấn đề hơn bạn sẽ giải quyết, như đã được đề cập nhiều lần trong chuỗi, Dropbox không được thiết kế cho trường hợp sử dụng này. Điều đó nói rằng, một phương pháp hoàn toàn an toàn để kết xuất kho lưu trữ trên Dropbox mà không cần bất kỳ plugin hoặc công cụ của bên thứ ba nào là sử dụng các gói. Tôi có các bí danh sau đây .gitconfigđể lưu gõ:

[alias]
        bundle-push = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"$1\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle create \"$path\" --all && git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-fetch = "!cd \"${GIT_PREFIX:-.}\" && if path=\"$(git config remote.\"$1\".url)\" && [ \"${path:0:1}\" = / ]; then git bundle verify \"$path\" && git fetch \"$1\"; else echo \"Not a bundle remote\"; exit 1; fi #"
        bundle-new = "!cd \"${GIT_PREFIX:-.}\" && if [ -z \"${1:-}\" -o -z \"${2:-}\" ]; then echo \"Usage: git bundle-new <file> <remote name>\"; exit 1; elif [ -e \"$2\" ]; then echo \"File exist\"; exit 1; else git bundle create \"$2\" --all && git remote add -f \"$1\" \"$(realpath \"$2\")\"; fi #"

Thí dụ:

# Create bundle remote (in local repo)
$ git bundle-new dropbox ~/Dropbox/my-repo.bundle
# Fetch updates from dropbox
$ git bundle-fetch dropbox
# NOTE: writes over previous bundle. Thus, roughly equivalent to push --force --prune --all
$ git bundle-push

2

Tôi đã phải đối mặt với một vấn đề tương tự và đã tạo ra một kịch bản nhỏ cho cùng. Ý tưởng là sử dụng Dropbox với Git một cách đơn giản nhất có thể. Hiện tại, tôi đã nhanh chóng triển khai mã Ruby và tôi sẽ sớm bổ sung thêm.

Kịch bản có thể truy cập tại https://github.com/nuttylabs/box-git.


0

Không sử dụng các công cụ tích hợp của bên thứ ba, tôi có thể cải thiện điều kiện một chút và sử dụng DropBox và các dịch vụ đĩa đám mây tương tự khác như SpiderOak với Git.

Mục đích là để tránh sự đồng bộ hóa ở giữa các sửa đổi tệp này, vì nó có thể tải lên một trạng thái một phần và sau đó sẽ tải xuống lại, làm hỏng hoàn toàn trạng thái git của bạn.

Để tránh vấn đề này, tôi đã làm:

  1. Gói chỉ số git của tôi trong một tệp bằng cách sử dụng git bundle create my_repo.git --all.
  2. Đặt độ trễ cho giám sát tệp, ví dụ 5 phút, thay vì tức thời. Điều này làm giảm cơ hội DropBox đồng bộ hóa trạng thái một phần ở giữa thay đổi. Nó cũng giúp ích rất nhiều khi sửa đổi các tệp trên đĩa đám mây đang hoạt động (chẳng hạn như với các ứng dụng ghi chú lưu tức thời).

Nó không hoàn hảo vì không có gì đảm bảo nó sẽ không làm rối loạn trạng thái git một lần nữa, nhưng nó giúp ích và hiện tại tôi không gặp phải vấn đề gì.


0

Trên MacOS, bạn cũng có thể chỉ dừng Dropbox, thực hiện các thay đổi và sau đó khởi chạy lại Dropbox. Tôi đang sử dụng kết hợp sau đây và tôi khá hài lòng với nó:

Trong cả hai (thư mục dự án được quản lý git cục bộ của bạn và kho lưu trữ git từ xa của bạn nằm trên Dropbox) chạy lệnh sau để tắt tự động đóng gói (đây là vấn đề chính với đồng bộ hóa dropbox)

git config --global gc.auto 0

Thỉnh thoảng, nén các kho lưu trữ với dropbox bị vô hiệu hóa. Ví dụ: tôi thực hiện các thao tác sau trong tập lệnh bash-build-script của mình bất cứ khi nào tôi phát hành các ứng dụng mới.

osascript -e "tell application \"Dropbox\" to quit"

# Compress local
git gc --prune=now; git repack -a -d

# Compress remote
REPOS_DIR_REMOTE=`git remote get-url --push origin`
cd "${REPOS_DIR_REMOTE}"
git gc --prune=now; git repack -a -d

osascript -e "tell application \"Dropbox\" to launch"
osascript -e "display notification with title \"Compress Done\""
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.