ใช้ Git และ Dropbox ร่วมกันอย่างมีประสิทธิภาพหรือไม่


1132

ฉันจะใช้GitและDropboxร่วมกันได้อย่างมีประสิทธิภาพได้อย่างไร


2
ดูเพิ่มเติมกวดวิชาแบรดลีย์ไรท์
Ron Romero

39
หากคุณเป็นเพียงทีมเล็ก ๆ (ฉันคิดว่ามากถึง 5 คน) BitBucket จะให้บริการพื้นที่ฟรีสำหรับที่เก็บส่วนตัว กระแทกแดกดันฉันมี repo ท้องถิ่นของฉันบน DropBox ในกรณีที่ฉันย้ายระหว่างคอมพิวเตอร์เมื่อฉันทำงานบางอย่าง
Mark Adamson

12
ฉันไม่แน่ใจว่าการทำซ้ำซ้อนในเวอร์ชันของคุณเป็นเรื่องน่าขัน แต่อาจมีประโยชน์มาก
silasdavis

2
คำถามนี้ไม่ชัดเจน การใช้เครื่องมือเหล่านี้ร่วมกัน "มีประสิทธิภาพ" หมายความว่าอย่างไร มันกว้างเกินไปและมีแนวโน้มที่จะสร้างคำตอบที่ให้ความเห็น

3
เฮ้คุณสามารถโปรดพิจารณาคำตอบของฉันเป็นคนหนึ่งที่ถูกต้อง: stackoverflow.com/a/32215708/589667 ห้องสมุดนี้ฉันพูดถึงในคำตอบของฉันเป็นเครื่องมืออย่างเป็นทางการที่สร้างขึ้นโดยนักพัฒนา dropbox เพื่อช่วยให้ผู้คนใช้ Git กับ Dropbox
clu

คำตอบ:


1401

ฉันคิดว่า Git บน Dropbox นั้นยอดเยี่ยม ฉันใช้มันตลอดเวลา ฉันมีคอมพิวเตอร์หลายเครื่อง (ที่บ้านสองเครื่องและอีกที่ทำงาน) ที่ฉันใช้ Dropbox เป็นที่เก็บส่วนกลาง เนื่องจากฉันไม่ต้องการให้โฮสต์บนบริการสาธารณะและฉันไม่สามารถเข้าถึงเซิร์ฟเวอร์ที่ฉันสามารถใช้งานได้ตลอดเวลา Dropbox ดูแลสิ่งนี้โดยการซิงค์ (เร็วมาก) ในพื้นหลัง

การตั้งค่าเป็นดังนี้:

~/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

จากตรงนั้นคุณสามารถโคลนได้~/Dropbox/git/project.gitว่าคุณเชื่อมโยงกับบัญชี Dropbox ของคุณ (หรือแชร์ไดเรกทอรีนี้กับคนอื่น) คุณสามารถดำเนินการตามปกติ Git ทั้งหมดและพวกเขาจะซิงค์กับเครื่องอื่น ๆ ของคุณโดยอัตโนมัติ

ฉันเขียนบล็อกโพสต์ในการควบคุมเวอร์ชัน ( ลิงก์เก่า ตาย ) เกี่ยวกับเหตุผลของฉันและวิธีการตั้งค่าสภาพแวดล้อมของฉันมันขึ้นอยู่กับประสบการณ์การพัฒนาRuby on Railsของฉันแต่สามารถนำไปใช้กับอะไรก็ได้


61
ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าคุณผลักดันไปยังกล่องเก็บคืน repo จากสองเครื่องในเวลาเดียวกัน หากมันจะทำให้เกิดการเปลี่ยนแปลงในไฟล์ภายในหนึ่งในคอมไพล์ดรอปบ็อกซ์จะแสดงให้คุณเห็นว่ามีข้อขัดแย้ง - แต่คุณจะทำอย่างไร? เพียงเลือกรุ่นใดรุ่นหนึ่งแล้วกดอีกครั้งจากทั้งสองเครื่อง (หนึ่งต่อหนึ่ง)?
dubek

162
@dubek: คุณอาจจะเสียหายซ้ำซ้อน repo เปลือย วิธีนี้เหมาะสำหรับทีมเล็ก ๆ (สองในกรณีของฉัน) ที่ผู้คนสามารถตะโกนผ่านผนังห้องเล็ก ๆ ของพวกเขา: "เฮ้! ไม่มีใครผลัก! ฉันกำลังผลัก!"
Ates Goral

50
@Ates: อย่างน้อยคอมไพล์ถูกกระจายอำนาจดังนั้นหากคุณจัดการกับสิ่งที่เสียหายคุณสามารถกู้คืนได้จากสำเนาในเครื่องของใครบางคน หากคุณมีทีมใหญ่โอกาสที่จะมีเงินเพียงพอสำหรับ repo ที่โฮสต์อยู่ที่ไหนสักแห่ง
rdrey

75
ฉันกลับมาที่หน้านี้มากกว่าห้าครั้งเพื่อใช้คำสั่งที่แน่นอนนี้ ฉันจะไม่จดจำพวกเขา แต่ขอบคุณที่ให้พวกเขา!
Jeremy Mack

32
@Jo: สลัมไม่เพียงพอ
Ates Goral

126

วิธีที่ถูกต้องในการทำเช่นนี้คือใช้ git-remote-dropbox: https://github.com/anishathalye/git-remote-dropbox

การสร้าง repo เปล่าของคุณเองใน Dropbox ทำให้เกิดปัญหามากมาย Anish (ผู้สร้างห้องสมุด) อธิบายได้ดีที่สุด :

สาเหตุหลักของปัญหาเหล่านี้คือไคลเอ็นต์เดสก์ท็อป Dropbox ได้รับการออกแบบมาสำหรับการซิงค์ไฟล์ไม่ใช่ที่เก็บ Git หากไม่มีการจัดการเป็นพิเศษสำหรับที่เก็บ Git ก็ไม่ได้รับประกันการรับประกันเช่นเดียวกับ Git การดำเนินการบนพื้นที่เก็บข้อมูลระยะไกลไม่ใช่อะตอมอีกต่อไปและการดำเนินการที่เกิดขึ้นพร้อมกันหรือช่วงเวลาที่โชคไม่ดีด้วยการซิงโครไนซ์อาจส่งผลให้เกิดที่เก็บข้อมูลที่เสียหาย

Git ดั้งเดิมรีโมตโค้ดที่ด้านเซิร์ฟเวอร์เพื่อให้ทำงานได้อย่างถูกต้อง แต่เราไม่สามารถทำได้

วิธีแก้ปัญหา: เป็นไปได้ที่จะแก้ปัญหานี้อย่างถูกต้อง เป็นไปได้ที่จะใช้ Git กับ Dropbox และมีการรับประกันความปลอดภัยและความมั่นคงเหมือนกันกับ Git ทางไกลแม้ว่าจะมีผู้ใช้หลายคนและการทำงานพร้อมกัน!

สำหรับผู้ใช้มันง่ายเหมือนการใช้ git-remote-dropbox ผู้ช่วยระยะไกล Git ที่ทำหน้าที่เป็นสะพานเชื่อมสองทิศทางที่โปร่งใสระหว่าง Git และ Dropbox และรับประกันการรับประกันของ Git แบบดั้งเดิมทั้งหมด แม้จะปลอดภัยที่จะใช้กับโฟลเดอร์ที่ใช้ร่วมกันดังนั้นจึงสามารถใช้สำหรับการทำงานร่วมกันได้ (มี repos ส่วนตัวไม่ จำกัด พร้อมผู้ทำงานร่วมกันไม่ จำกัด !)

ด้วยเครื่องมือช่วยเหลือระยะไกลคุณสามารถใช้ Dropbox เป็นรีโมท Git และใช้คำสั่ง Git ปกติทั้งหมดเช่น git clone, git pull และ git push และทุกอย่างจะทำงานได้อย่างที่คาดไว้


8
ฉันดีใจที่เห็นว่ามีคนโพสต์เกี่ยวกับ git-remote-dropbox ในคำถาม StackOverflow นี้ ฉันสงสัยว่ามีวิธีใดที่จะตอบสนองนี้ใกล้ชิดกับด้านบนหรือไม่ วิธีที่แนะนำโดยคำตอบที่ยอมรับในปัจจุบันนั้นค่อนข้างอันตรายและอาจส่งผลให้เกิดความเสียหายของที่เก็บ
fwenom

1
มันเจ๋งจริงๆ ฉันจะตรวจสอบอย่างแน่นอน แต่เมื่อฉันย้ายจากกล่อง dev หนึ่งไปยังอีกและต้องการที่จะทำงานใน repo sync'ed วิธีนี้จะทำงานเฉพาะถ้าฉันมักจะทำงานของฉันเมื่อฉันออกจากเครื่อง A และต้องการรับที่ฉันซ้ายออก เครื่อง B. ฉันถูกไหม ถ้าเป็นเช่นนี้ไม่เหมาะอย่างที่มันจะนำไปสู่ความวุ่นวายของ "ความมุ่งมั่น" ระหว่างกาลซึ่งใครจะเถียงจะก่อให้เกิดมลพิษประวัติศาสตร์กระทำของ repo บางทีฉันก็แค่ไม่มีเค้กและกินมันด้วย!
bhu Boue vidya

@bhuBouevidya ไม่นั่นไม่ใช่เรื่องจริง คุณไม่จำเป็นต้องผูกมัดงานของคุณเพื่อทำการเปลี่ยนแปลงโดยซิงค์ ตราบใดที่ไฟล์ถูกบันทึกไฟล์จะถูกซิงค์ โดยทั่วไปถ้าคุณมีไฟล์ที่ได้รับการดัดแปลงมากมายในเครื่องหนึ่งการแก้ไขจะซิงค์กับอีกเครื่องหนึ่งเนื่องจาก Dropbox สนใจสิ่งที่บันทึกไว้ในดิสก์
clu

2
@clu: ใช่คุณต้องทำงานและผลักดันของคุณ git-remote-dropbox ทั้งหมดนั้นทำหน้าที่เป็นผู้ช่วยรีโมต git เช่นเดียวกับรีโมตอื่น ๆ การคอมมิทในพื้นที่ของคุณจะไม่ถูกผลักไปที่รีโมตจนกว่าการกดจะเสร็จสิ้น วิธีในการรับไฟล์ที่ถูกแก้ไขในเครื่องไปยังที่เก็บในเครื่องเพื่อให้สามารถผลักได้คือทำการคอมมิต Dropbox จะไม่รู้อะไรเกี่ยวกับไฟล์ของคุณที่ไม่ได้อยู่ในที่เก็บ
มด

2
แค่อยากรู้ว่า git-remote-dropbox เป็น cross-platform ... ฉันเห็นว่ามันใช้ python และฉันรู้ว่าบางอย่างของ python สำหรับ Dropbox นั้นไม่ได้ข้ามแพลตฟอร์มตัวอย่างเช่นบน OS X สิ่งที่บรรทัดคำสั่งไม่รองรับ
Michael

89

คำตอบนี้ขึ้นอยู่กับประสบการณ์ของMercurialไม่ใช่ Git แต่ประสบการณ์นี้กล่าวว่าการใช้ Dropbox ด้วยวิธีนี้จะขอพื้นที่เก็บข้อมูลที่เสียหายหากมีโอกาสที่คุณจะอัปเดตพื้นที่เก็บข้อมูลที่ใช้ Dropbox เดียวกันจากเครื่องต่างๆในเวลาต่างๆ (Mac Unix, Windows ในกรณีของฉัน)

ฉันไม่มีรายการที่สมบูรณ์ของสิ่งที่ผิดพลาด แต่นี่เป็นตัวอย่างเฉพาะที่ทำให้ฉันรู้สึกแย่ แต่ละเครื่องมีความคิดของตัวละครในตอนท้ายและวิธีจัดการอักขระตัวพิมพ์ใหญ่ / เล็กในชื่อไฟล์ Dropbox และ Git / Mercurial จัดการสิ่งนี้แตกต่างกันเล็กน้อย (ฉันไม่จำความแตกต่างที่แน่นอน) หาก Dropbox อัปเดตที่เก็บด้านหลัง Git / Mercurial ด้านหลัง, presto, ที่เก็บที่ใช้งานไม่ได้ สิ่งนี้เกิดขึ้นทันทีและมองไม่เห็นดังนั้นคุณจึงไม่ทราบว่าที่เก็บข้อมูลของคุณเสียจนกว่าคุณจะพยายามกู้คืนบางสิ่งจากมัน

หลังจากขุดออกมาจากสิ่งหนึ่งที่ทำสิ่งนี้ฉันได้ใช้สูตรต่อไปนี้ที่ประสบความสำเร็จและไม่มีวี่แววของปัญหา เพียงย้ายที่เก็บข้อมูลของคุณออกจาก Dropbox ใช้ Dropbox สำหรับทุกสิ่ง เอกสาร, ไฟล์ JARอะไรก็ได้ที่คุณต้องการ และใช้GitHub (Git) หรือBitbucket (Mercurial) เพื่อจัดการพื้นที่เก็บข้อมูลเอง ทั้งสองเป็นอิสระดังนั้นสิ่งนี้จะไม่เพิ่มค่าใช้จ่ายใด ๆ และตอนนี้เครื่องมือแต่ละชิ้นก็เล่นได้ถึงจุดแข็งของมัน

การรัน Git / Mercurial ที่ด้านบนของ Dropbox ไม่ได้เพิ่มความเสี่ยง แต่อย่างใด อย่าทำมัน


13
ฉันรู้สึกว่าที่เก็บ git นั้นแข็งแกร่งพอที่จะไม่ทำลายตัวเอง ประสบการณ์ของฉัน (มากกว่าหนึ่งปีของการใช้งานซึ่งส่วนใหญ่เป็นผู้ใช้คนเดียวข้ามแพลตฟอร์มคอมพิวเตอร์หลาย ๆ ตัว) นั่นคือ repo ของคอมไพล์ไม่เสียหายอย่างง่ายดาย ในคอมไพล์เพียงเพิ่มข้อมูลไปยังที่เก็บไฟล์ที่มีอยู่จะถูกทิ้งให้อยู่คนเดียว 99.9% ของเวลา (ไฟล์ที่ไม่แน่นอนส่วนใหญ่จะตรวจสอบด้วยตนเองได้ง่าย) บางครั้งฉันเคยเห็นกรณีที่ตัวชี้สาขาถูกเขียนทับ แต่สามารถเห็นได้ง่าย (เช่น "branch (สำเนาของ XXX ที่ขัดแย้งกัน)") และลบออก (ไม่จำเป็นต้องแก้ไขจริง)
Egon

1
@tc: คุณถูกต้องในระหว่างการรวบรวมขยะข้อมูลที่ไม่สามารถเข้าถึงได้จะถูกลบออกในคอมไพล์ อย่างไรก็ตามฉันเดาว่าสำหรับกรณีที่ใช้งานได้จริงจะไม่ส่งผลกระทบต่อความทนทาน: ข้อมูลที่ไม่สามารถเข้าถึงได้ที่มีอายุเกิน 2 สัปดาห์เท่านั้น (ซึ่งเป็นเวลาที่เพียงพอสำหรับ DropBox ในการซิงโครไนซ์) และในช่วงเวลานั้นของความขัดแย้งดังกล่าวฉันสงสัยว่าข้อมูลส่วนใหญ่จะมีให้ทั้งในรูปแบบที่บรรจุแล้วและยังไม่ได้แพ็ค
Egon

ฉันคิดว่าสถานการณ์การแบ่งปันรหัสที่ไม่มี repo ส่วนกลาง (คำตอบในด้านล่าง) จะบันทึกหนึ่งจากความเสียหายที่อาจเกิดขึ้นเนื่องจากการปรับปรุงพร้อมกันไปยังไดเรกทอรีใน Dropbox หากต้องการ repo ส่วนกลางก็สามารถจัดการแยกต่างหาก (และออกจาก Dropbox); ดรอปบ็อกซ์จะเก็บ repos ส่วนบุคคลไว้ใช้งาน (ซึ่งสะดวกเพราะคุณสามารถอัปเดต / ดึงข้อมูลจากแหล่งข้อมูล repo ของบุคคลอื่นในทีมของคุณที่คุณทำงานอยู่) (จริง ๆ แล้วฉันใคร่ครวญการใช้ darcs ในสภาพแวดล้อมแบบนี้)
imz - Ivan Zakharyaschev

5
+1 หากคุณไม่ต้องการโฮสต์ที่เก็บของคุณในที่สาธารณะให้ใช้Bitbucketส่วนเก็บข้อมูลส่วนตัวฟรีสำหรับทีมที่มีผู้ใช้มากถึง 5 คน
Christian Specht

สิ่งหนึ่งที่ฉันสังเกตเห็นระหว่างเครื่อง Windows และเครื่อง OSX คือการอนุญาตให้ใช้ไฟล์อาจทำให้เกิดปัญหา diff คุณสามารถปิดการอนุญาตใน Git ได้โดยใช้: "git config core.fileMode false"
devdrc

16

สำหรับทีมเล็ก ๆ ที่ใช้ Dropbox:

หากนักพัฒนาซอฟต์แวร์แต่ละคนมีพื้นที่เก็บข้อมูลเปลือยที่เขียนได้ของตนเองบน Dropbox ซึ่งจะถูกดึงไปยังผู้พัฒนารายอื่นเท่านั้นสิ่งนี้จะช่วยให้การใช้รหัสร่วมกันโดยไม่มีความเสี่ยงต่อการทุจริต!

ถ้าคุณต้องการ 'การฉีด' แบบรวมศูนย์คุณสามารถให้ผู้พัฒนารายหนึ่งจัดการการผลักดันทั้งหมดจาก repo ของพวกเขาเอง


1
เยี่ยมมาก! นอกจากนี้เพื่อป้องกันความเสียหายของ repo จากการเขียนหลาย ๆ ครั้งคุณสามารถสร้าง repos ได้หลายรายการและซิงค์เฉพาะโฟลเดอร์. git เท่านั้น! ทั้งหมดที่คุณต้องการในเวลา - คือการดึงจากแหล่งที่ต้องการ! สุดยอดมนุษย์ P-to-P! คุณเข้าใจปรัชญาของคอมไพล์ที่กระจายอำนาจแล้ว!
Brian Haak

16

ฉันไม่ต้องการวางโครงการทั้งหมดของฉันไว้ในที่เก็บ Git เดียวและไม่ต้องการเข้าไปและเรียกใช้รหัสนี้สำหรับทุก ๆ โครงการดังนั้นฉันจึงสร้างBash script ที่จะทำให้กระบวนการทำงานโดยอัตโนมัติ คุณสามารถใช้มันกับหนึ่งหรือหลายไดเรกทอรี - ดังนั้นมันสามารถทำรหัสในโพสต์นี้สำหรับคุณหรือมันสามารถทำได้ในหลายโครงการในครั้งเดียว

#!/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

ฉันไม่คิดว่าการใช้ Git และ Dropbox เป็นวิธีที่จะไป ... แค่คิดเกี่ยวกับคุณสมบัติของทั้งสอง:

Git:

  • ช่วยให้คุณมีพื้นที่เก็บข้อมูลส่วนกลาง
  • ช่วยให้คุณมีพื้นที่เก็บข้อมูลของคุณเองด้วยการเปลี่ยนแปลงของคุณเอง
  • ช่วยให้คุณสามารถส่งและรับการเปลี่ยนแปลงจากพื้นที่เก็บข้อมูลส่วนกลาง
  • อนุญาตให้บุคคลหลายคนเปลี่ยนไฟล์เดียวกันและรวมเข้าด้วยกันหรือขอให้คุณรวมพวกเขาหากไม่สามารถทำได้
  • มีเว็บและไคลเอนต์เดสก์ท็อปเพื่ออนุญาตการเข้าถึงที่เก็บส่วนกลาง

Dropbox:

  • เก็บทุกอย่างในที่เก็บส่วนกลาง
  • ช่วยให้คุณมีไฟล์เวอร์ชันในเซิร์ฟเวอร์ของคุณเอง
  • บังคับให้คุณส่งและรับการเปลี่ยนแปลงจากที่เก็บส่วนกลาง
  • หากมีหลายคนเปลี่ยนไฟล์เดียวกันไฟล์แรกที่คอมมิทชั่นจะถูกแทนที่ด้วยคอมมิทในภายหลังและจะไม่มีการผสานเกิดขึ้นซึ่งเป็นปัญหา
  • มีเว็บและไคลเอนต์เดสก์ท็อปเพื่ออนุญาตการเข้าถึงที่เก็บส่วนกลาง

และถ้าคุณกังวลเกี่ยวกับการแชร์ไฟล์บางไฟล์ทำไมไม่ลองเข้ารหัสมันล่ะ? และจากนั้นคุณจะได้รับประโยชน์มากที่สุดจาก Dropbox to Git นั่นคือมีไฟล์สาธารณะและส่วนตัว ...


Dropbox เป็นเพียงตัวเลือกที่ดีสำหรับ repo ส่วนกลาง หากวางไว้ในโฟลเดอร์ที่แชร์จะสามารถใช้งานได้เป็นกลุ่ม
แม็ค

ใช่ แต่คุณจะไม่มีคุณสมบัติการรวมเช่นเดียวกับในคอมไพล์ในความเป็นจริงถ้าใครบางคนกำลังแก้ไขไฟล์เดียวกับคุณและเขาบันทึกไฟล์หลังจากที่คุณการเปลี่ยนแปลงของคุณจะหายไปเว้นแต่คุณจะไปที่เว็บอินเตอร์เฟสและดาวน์โหลด เวอร์ชันเก่า (เวอร์ชั่นของคุณ)
โคโยตี้ 21

8
นี่เป็นสิ่งที่ผิด ดรอปบ็อกซ์จะไม่ลดความขัดแย้ง มันทำให้ชื่อไฟล์ของการแก้ไขอันใดอันหนึ่งและใช้อันอื่นเพื่อความต่อเนื่อง คุณสามารถรวมเข้าด้วยกันด้วยตนเองหากคุณต้องการ มันเป็นการประนีประนอมที่ดีและไม่สูญเสียข้อมูล dropbox.com/help/36
Clueless

5
ใช่ แต่เนื่องจากนี่เป็นเรื่องเกี่ยวกับรหัสเวลาที่ฉันใช้เวลาในการรวมไฟล์ยิ่งน้อยเท่าไรฉันก็สามารถสร้างโค้ดได้มากขึ้นและใน codebase ปกติมันอาจจะเป็นความขัดแย้งหลายร้อยครั้งในครั้งเดียวขึ้นอยู่กับขนาดโครงการ รวมแล้วทีละคนแม้จะมีความช่วยเหลือของเครื่องมือผสานเช่น WinMerge (หรือบางสิ่งบางอย่างเหมือนกัน)
โคโยตี้

15

ตอนนี้เป็นปี 2558 และเมื่อสามวันที่ผ่านมาเครื่องมือใหม่ที่ใช้Dropbox API v2ได้ถูกสร้างขึ้นเพื่อใช้งานคอมไพล์อย่างปลอดภัยบน Dropbox ใช้งานได้กับ API แทนที่จะใช้เดสก์ท็อปไคลเอ็นต์และจัดการการพุชหลายครั้งพร้อมกันไปยังที่เก็บที่โฮสต์ในโฟลเดอร์ที่แชร์อย่างถูกต้อง

เมื่อกำหนดค่าแล้วจะอนุญาตให้หนึ่งตั้งค่ารีโมท Git เหมือนกับรีโมท Git อื่น ๆ

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

2
มันจะดีถ้าตัวดัดแปลงบางตัวจะรวมคำถาม git-with-dropbox ทั้งหมดใน stackexchange ภายใต้ superthread ที่กล่าวถึงสิ่งล่าสุดก่อน
แบลร์ฮัฟตั้น

9

ผมใช้ Mercurial (หรือ Git) + + TrueCrypt Dropbox สำหรับการเข้ารหัสระยะไกลการสำรองข้อมูล

สิ่งที่ยอดเยี่ยมที่สุดคือ Dropbox จะไม่ซิงค์ทั้ง TrueCrypt container หากคุณแก้ไขส่วนเล็ก ๆ ของรหัสของคุณ เวลาในการซิงค์นั้นแปรผันตามปริมาณการเปลี่ยนแปลง แม้ว่าจะมีการเข้ารหัส แต่การรวมกันของ TrueCrypt + Dropbox ทำให้สามารถใช้การซิงค์ระดับบล็อกและตัวเลขระดับบล็อกได้อย่างยอดเยี่ยม

ประการที่สองภาชนะเข้ารหัสเสาหินไม่เพียงแค่เพิ่มการรักษาความปลอดภัยก็ยังช่วยลดโอกาสในการเก็บข้อมูลการทุจริต

ข้อควรระวัง:อย่างไรก็ตามคุณต้องระมัดระวังไม่ให้มีการติดตั้งคอนเทนเนอร์ในขณะที่ Dropbox ทำงานอยู่ นอกจากนี้ยังอาจเป็นความเจ็บปวดในการแก้ไขข้อขัดแย้งหากไคลเอนต์ 2 คนเช็คอินในเวอร์ชันที่แตกต่างกันไปยังคอนเทนเนอร์ ดังนั้นจึงมีประโยชน์สำหรับคนเดียวที่ใช้มันเพื่อสำรองข้อมูลไม่ใช่สำหรับทีม

ติดตั้ง:

  • สร้างที่เก็บ Truecrypt (หลาย Gigabyte ใช้ได้)
  • ภายใต้การตั้งค่า Truecrypt ให้ยกเลิกการเลือกpreserve modification timestamp*
  • สร้าง repo ตามที่กล่าวไว้ข้างต้นโดย Dan ( https://stackoverflow.com/a/1961515/781695 )

การใช้งาน:

  • ออกจาก Dropbox
  • เมานต์คอนเทนเนอร์ผลักดันการเปลี่ยนแปลงของคุณยกเลิกการต่อเชื่อม
  • เรียกใช้ดรอปบ็อกซ์

PS ยกเลิกการเลือกpreserve modification timestampบอกดรอปบ็อกซ์ว่าไฟล์ได้รับการแก้ไขและควรซิงค์ โปรดทราบว่าการติดตั้งคอนเทนเนอร์จะแก้ไขการประทับเวลาแม้ว่าคุณจะไม่เปลี่ยนแปลงไฟล์ใด ๆ ก็ตาม หากคุณไม่ต้องการที่จะเกิดขึ้นเพียงเมานไดรฟ์เป็นread-only


มันจะแตกต่างกันมากหรือไม่หากใช้ภาพอิมเมจไฟล์. dmg ที่เข้ารหัส macosเวลาซิงค์จะยังคงเป็นสัดส่วนกับการเปลี่ยนแปลงหรือไม่
IBrum

@ IBrum ขออภัยฉันไม่ได้ลองด้วยไฟล์. dmg
ผู้ใช้

7

ฉันรักคำตอบของ Dan McNevin! ตอนนี้ฉันใช้ Git และ Dropbox ด้วยกันและฉันใช้นามแฝงหลายรายการใน. bash_profileของฉันเพื่อให้เวิร์กโฟลว์ของฉันมีลักษณะดังนี้:

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

นี่คือนามแฝงของฉัน:

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'

ฉันอาจจะไม่ใช้สิ่งสุดท้ายเป็นนามแฝงแทนที่จะเป็นเชลล์สคริปต์ มิฉะนั้นฉันชอบสิ่งนี้มาก เครดิตพิเศษสำหรับการใช้ awk
pauljohn32

6

เราใช้วิธีนี้ (สร้างที่เก็บเปลือยใน Dropbox) ในโฟลเดอร์แชร์โฟลเดอร์ที่ใช้ร่วม

กลุ่มนักพัฒนาขนาดเล็กสามารถดึงจากที่เก็บซิงค์ที่เปลือยเปล่าและสร้างโคลนท้องถิ่น เมื่อหน่วยการทำงานเสร็จสิ้นเราจะผลักดันกลับไปที่จุดเริ่มต้น

สิ่งหนึ่งที่ฉันขาดหายไปคือวิธีที่ดีในการส่งอีเมลพร้อมกับข้อมูลชุดการเปลี่ยนแปลงเมื่อมีการส่งถึงแหล่งกำเนิด เรากำลังใช้ Google Wave เพื่อติดตามการเปลี่ยนแปลงด้วยตนเอง


81
มีใครบางคนกำลังใช้ Google Wave หรือ
Kristopher Johnson

6

ฉันใช้ Mercurial ในลักษณะที่แนะนำและขอให้คุณระมัดระวังโดยเฉพาะอย่างยิ่งหากมีเครื่องแตกต่างกัน Dropbox fora เต็มไปด้วยข้อร้องเรียนเกี่ยวกับปัญหาชื่อไฟล์ลึกลับที่ปรากฎขึ้นเองตามธรรมชาติ Hg (และฉันเข้าใจ Git) จะไม่แจ้งให้ทราบหรือบ่นในระหว่างการตรวจสอบตามปกติและคุณจะได้ยินเกี่ยวกับความเสียหายเมื่อบ่นว่า repo ที่เสียหายเมื่อคุณพยายามใช้งานจริง ข่าวร้าย. หวังว่าฉันจะได้เฉพาะเจาะจงมากขึ้นเกี่ยวกับปัญหาและวิธีแก้ปัญหา ฉันยังคงพยายามที่จะขุดออกจากระเบียบนี้ด้วยตัวเอง


ฉันมีปัญหาแบบเดียวกันกับ Mercurial
Tomba

คอมไพล์ทำการตรวจสอบความเสียหายมากกว่าการออกแบบอื่น ๆ อย่างน้อยคุณจะรู้ว่าเมื่อใดที่เกิดขึ้นและสามารถแก้ไขปัญหาได้
Anders

6

นอกจากนี้ยังมีโครงการโอเพ่นซอร์ส (ชุดรวมสคริปต์ข้ามแพลตฟอร์ม [Linux, Mac, Win]) ที่ทำรายละเอียดทั้งหมดของการจัดการพื้นที่เก็บข้อมูลด้วยคำสั่งจำนวนเล็กน้อย (3-4)

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

ตัวอย่างการใช้งาน:

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

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

หลังจากนั้นการใช้งานคอมไพล์ปกติ:

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

ตรวจสอบวิกิโครงการและคู่มือสำหรับการอ้างอิงคำสั่งเต็มรูปแบบและแบบฝึกหัด


4

ฉันเก็บ repo ที่ไม่ใช่ Github บน Dropbox ข้อแม้หนึ่งที่ฉันพบคือการซิงค์หลังจากติดตั้งใหม่ Dropbox จะดาวน์โหลดไฟล์ที่เล็กที่สุดก่อนที่จะย้ายไปยังไฟล์ที่มีขนาดใหญ่กว่า ไม่ใช่ปัญหาถ้าคุณเริ่มตอนกลางคืนและกลับมาหลังจากวันหยุดสุดสัปดาห์ :-)

กระทู้ของฉัน - http://forums.dropbox.com/topic.php?id=29984&replies=6


4

ตอนนี้ในปี 2014 ฉันใช้ Git และ Dropbox มาประมาณหนึ่งปีครึ่งโดยไม่มีปัญหา บางจุดแม้ว่า:

  • เครื่องของฉันทั้งหมดที่ใช้ Dropbox อยู่บน Windows รุ่นต่าง ๆ (7 ถึง 8) + 1 mac
  • ฉันไม่แชร์ที่เก็บกับคนอื่นดังนั้นฉันจึงเป็นคนเดียวที่จะแก้ไข
  • git push พุชไปที่ที่เก็บรีโมตดังนั้นถ้ามันเสียหายฉันจะสามารถกู้คืนได้อย่างง่ายดาย
  • ฉันต้องสร้างนามแฝงC:\Usersด้วยmklink /D link targetเพราะห้องสมุดบางแห่งชี้ไปที่ตำแหน่งแน่นอน

3

ฉันชอบคำตอบที่ได้รับการโหวตจาก Dan McNevin ฉันลงเอยด้วยการเรียงลำดับคำสั่ง git หลายครั้งเกินไปและตัดสินใจสร้างสคริปต์ ดังนั้นนี่คือ:

#!/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}"

สคริปต์ต้องการชื่อโครงการเท่านั้น มันจะสร้างพื้นที่เก็บข้อมูลคอมไพล์ใน~/Dropbox/git/ภายใต้ชื่อที่ระบุและจะผลักดันเนื้อหาทั้งหมดของไดเรกทอรีปัจจุบันไปยังสาขาต้นแบบต้นแบบที่สร้างขึ้นใหม่ หากมีการกำหนดชื่อโครงการมากกว่าหนึ่งชื่ออาร์กิวเมนต์ชื่อโครงการที่ถูกต้องที่สุดจะถูกนำมาใช้

เป็นทางเลือกอาร์กิวเมนต์คำสั่ง -r ระบุสาขาระยะไกลที่จะผลักดันไปยังต้นแบบต้นแบบ ตำแหน่งของต้นแบบต้นฉบับของโครงการยังสามารถระบุได้ด้วยอาร์กิวเมนต์ -m ไฟล์. gitignore เริ่มต้นจะอยู่ในไดเรกทอรีสาขาระยะไกลด้วย มีการระบุค่าเริ่มต้นของไดเรกทอรีและแฟ้ม. gitignore ในสคริปต์


3

วิธีอื่น:

คำตอบทั้งหมดจนถึงขณะนี้รวมถึง@Danซึ่งเป็นคำตอบที่ได้รับความนิยมมากที่สุดกล่าวถึงแนวคิดของการใช้ Dropbox เพื่อรวมศูนย์ที่เก็บข้อมูลที่ใช้ร่วมกันแทนที่จะใช้บริการที่เน้น git เช่น github, bitbucket เป็นต้น

แต่เนื่องจากคำถามเดิมไม่ได้ระบุสิ่งที่ใช้ "Git และ Dropbox ร่วมกันอย่างมีประสิทธิภาพ" จริงๆแล้วเรามาลองใช้วิธีอื่น: "การใช้ Dropbox เพื่อซิงค์เฉพาะ worktree"

วิธีการมีขั้นตอนเหล่านี้:

  1. ภายในไดเรกทอรีโครงการหนึ่งสร้าง.gitไดเรกทอรีว่าง(เช่นmkdir -p myproject/.git)

  2. ยกเลิกการซิงค์.gitไดเรกทอรีใน Dropbox หากใช้แอพ Dropbox: ไปที่การตั้งค่าการซิงค์และ "เลือกโฟลเดอร์ที่จะซิงค์" ซึ่ง.gitไดเรกทอรีจะต้องถูกยกเลิกการทำเครื่องหมาย จะเป็นการลบ.gitไดเรกทอรี

  3. เรียกใช้git initในไดเรกทอรีโครงการ

นอกจากนี้ยังใช้งานได้หาก.gitมีอยู่แล้วทำขั้นตอนที่ 2 เท่านั้น Dropbox จะเก็บสำเนาของไฟล์ git ในเว็บไซต์

ขั้นตอนที่ 2 จะทำให้ Dropbox ไม่ซิงค์โครงสร้างระบบ git ซึ่งเป็นผลลัพธ์ที่ต้องการสำหรับวิธีการนี้

ทำไมต้องใช้วิธีนี้

  • การเปลี่ยนแปลงที่ยังไม่ได้ผลักจะมีการสำรองข้อมูล Dropbox และพวกเขาจะซิงค์กับอุปกรณ์

  • ในกรณีที่ Dropbox สกรูบางสิ่งบางอย่างเมื่อทำการซิงค์ระหว่างอุปกรณ์git statusและgit diffจะเป็นประโยชน์ในการจัดเรียงสิ่งต่าง ๆ

  • มันช่วยประหยัดพื้นที่ในบัญชี Dropbox (ประวัติทั้งหมดจะไม่ถูกเก็บไว้ที่นั่น)

  • มันหลีกเลี่ยงความกังวลที่เกิดขึ้นโดย @dubek และ @Ates ในการแสดงความคิดเห็นเกี่ยวกับ @ คำตอบของแดนและความกังวลโดย @clu ในคำตอบอื่น

การมีรีโมตอยู่ที่อื่น (github ฯลฯ ) จะใช้ได้ดีกับวิธีนี้

การทำงานในสาขาต่าง ๆ นำมาซึ่งปัญหาที่ต้องได้รับการดูแล:

  • ปัญหาหนึ่งที่อาจเกิดขึ้นคือมี Dropbox (โดยไม่จำเป็น?) ทำการซิงค์ไฟล์จำนวนมากที่อาจเกิดขึ้นเมื่อตรวจสอบสาขาที่แตกต่างกัน

  • หากอุปกรณ์ที่ซิงค์ข้อมูล Dropbox สองรายการขึ้นไปมีสาขาต่างกันชำระเงินการเปลี่ยนแปลงที่ไม่ได้ทำไว้กับอุปกรณ์ทั้งสองนั้นอาจสูญหายได้

วิธีหนึ่งในการแก้ไขปัญหาเหล่านี้คือการใช้git worktreeเพื่อเก็บเงินจากสาขาในไดเรกทอรีแยกต่างหาก


ในฐานะที่เป็นคนที่ทำงานกับไฟล์ที่มันดีต่อการควบคุมเวอร์ชัน แต่ก็สามารถแก้ไขได้บน iPad (ผ่านการซิงค์ Dropbox) คำตอบนี้ครอบคลุมถึงกรณีที่ใช้
Vagari

การติดตามอย่างรวดเร็วพฤติกรรม Dropbox ปัจจุบันแตกต่างกัน เพียงแค่ลบและแจ้งให้ Dropbox ไม่ทำการซิงค์หมายความว่าอยู่ตรงข้ามอยู่ในคลาวด์และลบออกจากท้องถิ่น แต่มีคำตอบที่ยอดเยี่ยมพร้อมโซลูชัน superuser.com/a/1527145/109561ในของฉันกรณี (บน Mac) xattr -w com.dropbox.ignored 1 /path/to/somewhereสถานะต่อไปนี้ไฟล์สำหรับการละเว้น
Vagari

3

สำหรับ Dropbox 2 เซนต์ของฉันทำให้รู้สึกได้ถึงการใช้งานส่วนตัวซึ่งคุณไม่ต้องการรบกวนการรับโฮสต์ repo ส่วนกลาง สำหรับการพัฒนาทางอาชีพใด ๆ คุณอาจสร้างปัญหามากกว่าที่คุณจะแก้ปัญหาดังที่ได้กล่าวไว้หลายครั้งในเธรดแล้ว Dropbox ไม่ได้ออกแบบมาสำหรับกรณีการใช้งานนี้ วิธีดังกล่าวมีความปลอดภัยอย่างสมบูรณ์ในการทิ้งที่เก็บข้อมูลบน Dropbox โดยไม่มีปลั๊กอินหรือเครื่องมือของบุคคลที่สามใด ๆ คือใช้มัด ฉันมีนามแฝงต่อไปนี้.gitconfigเพื่อบันทึกการพิมพ์:

[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 #"

ตัวอย่าง:

# 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

ฉันได้พบกับปัญหาที่คล้ายกันและได้สร้างสคริปต์เล็ก ๆ สำหรับเหมือนกัน แนวคิดคือการใช้ Dropbox กับ Git อย่างง่ายที่สุด ขณะนี้ฉันใช้รหัสทับทิมอย่างรวดเร็วและฉันจะเพิ่มอีกไม่นาน

https://github.com/nuttylabs/box-gitสคริปต์ที่สามารถเข้าถึงได้


0

โดยไม่ต้องใช้เครื่องมือการรวมบุคคลที่สามฉันสามารถปรับปรุงเงื่อนไขเล็กน้อยและใช้ DropBox และบริการดิสก์คลาวด์อื่น ๆ ที่คล้ายคลึงกันเช่น SpiderOak กับ Git

เป้าหมายคือเพื่อหลีกเลี่ยงการซิงโครไนซ์ที่อยู่ตรงกลางของการแก้ไขไฟล์เหล่านี้เนื่องจากมันสามารถอัปโหลดสถานะบางส่วนแล้วจะดาวน์โหลดกลับมาอีกครั้งทำให้สถานะคอมไพล์ของคุณเสียหายอย่างสมบูรณ์

เพื่อหลีกเลี่ยงปัญหานี้ฉันได้:

  1. Bundle git bundle create my_repo.git --allดัชนีคอมไพล์ของฉันในหนึ่งไฟล์โดยใช้
  2. ตั้งค่าการหน่วงเวลาสำหรับการตรวจสอบไฟล์เช่น 5 นาทีแทนที่จะเป็นแบบทันที สิ่งนี้จะช่วยลดโอกาสที่ DropBox จะซิงโครไนซ์สถานะบางส่วนในช่วงกลางของการเปลี่ยนแปลง นอกจากนี้ยังช่วยได้อย่างมากเมื่อทำการแก้ไขไฟล์บนดิสก์คลาวด์ on-the-fly (เช่นแอปบันทึกข้อความที่บันทึกทันที)

มันไม่สมบูรณ์แบบเนื่องจากไม่มีการรับประกันว่าจะไม่ทำให้สถานะของ git ยุ่งเหยิงอีกต่อไป แต่มันช่วยและในขณะที่ฉันไม่ได้รับปัญหาใด ๆ


0

ใน MacOS คุณสามารถหยุด Dropbox ทำการเปลี่ยนแปลงแล้วเปิด Dropbox อีกครั้ง ฉันใช้ชุดค่าผสมต่อไปนี้และมีความสุขมากกับ:

ในทั้งสอง (ไดเรกทอรีโครงการที่จัดการโดย git ในพื้นที่ของคุณและที่เก็บ git ระยะไกลของคุณอยู่ที่ Dropbox) ให้เรียกใช้คำสั่งต่อไปนี้เพื่อปิดการใช้งานการบรรจุอัตโนมัติ (ซึ่งเป็นปัญหาหลักของการซิงค์ดรอปบ็อกซ์)

git config --global gc.auto 0

จากนั้นบีบอัดที่เก็บเป็นครั้งคราวโดยปิดใช้งานดรอปบ็อกซ์ ตัวอย่างเช่นฉันทำสิ่งต่อไปนี้ใน bash-build-script ทุกครั้งที่ฉันเปิดตัวแอปใหม่

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\""
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.