Menggunakan Git dan Dropbox bersama secara efektif?


1133

Bagaimana cara menggunakan Git dan Dropbox bersama secara efektif?



39
Jika Anda hanya tim kecil (hingga 5 saya pikir), maka BitBucket menyediakan hosting gratis untuk repositori pribadi. Ironisnya saya kemudian memiliki repo lokal saya di DropBox, kalau-kalau saya berpindah di antara komputer ketika saya sedang mengerjakan sesuatu.
Mark Adamson

12
Saya tidak yakin bahwa redundansi versi Anda adalah ironis, tetapi mungkin cukup berguna
silasdavis

2
Pertanyaan ini tidak jelas. Apa artinya menggunakan alat-alat ini bersama-sama "secara efektif"? Itu juga terlalu luas, dan cenderung menghasilkan jawaban yang beralasan.

3
Hei, tolong pertimbangkan jawaban saya sebagai yang benar: stackoverflow.com/a/32215708/589667 . Pustaka ini yang saya sebutkan dalam jawaban saya adalah alat resmi yang dibuat oleh pengembang dropbox untuk membantu orang menggunakan Git dengan Dropbox.
clu

Jawaban:


1401

Saya pikir Git di Dropbox hebat. Saya menggunakannya sepanjang waktu. Saya memiliki beberapa komputer (dua di rumah dan satu di tempat kerja) yang saya gunakan Dropbox sebagai repositori telanjang pusat. Karena saya tidak ingin meng-host-nya di layanan publik, dan saya tidak memiliki akses ke server yang selalu bisa saya ssh, Dropbox menangani ini dengan menyinkronkan (sangat cepat) di latar belakang.

Setup adalah sesuatu seperti ini:

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

Dari sana, Anda dapat mengkloning ~/Dropbox/git/project.gityang telah dikaitkan dengan akun Dropbox Anda (atau telah berbagi direktori ini dengan orang-orang), Anda dapat melakukan semua operasi Git normal dan mereka akan disinkronkan ke semua mesin lain secara otomatis.

Saya menulis posting blog, Pada Kontrol Versi , ( tautan lama mati ) pada alasan saya dan bagaimana saya mengatur lingkungan saya, itu didasarkan pada pengalaman pengembangan Ruby on Rails saya , tetapi dapat diterapkan pada apa saja, sungguh.


61
Saya ingin tahu apa yang akan terjadi jika Anda mendorong ke dropbox telanjang repo dari dua mesin secara bersamaan. Jika itu akan menyebabkan modifikasi pada salah satu file internal git, dropbox akan menunjukkan kepada Anda ada konflik - tetapi apa yang Anda lakukan? Cukup pilih salah satu versi, lalu dorong lagi dari kedua mesin (satu per satu)?
dubek

162
@dubek: Anda mungkin pada akhirnya merusak repo telanjang bersama. Pendekatan ini hanya cocok untuk tim kecil (dua dalam kasus saya) di mana orang hanya bisa berteriak di dinding bilik mereka: "Hei! Tidak ada yang mendorong! Aku mendorong sekarang!".
Ates Goral

50
@Ates: Setidaknya git terdesentralisasi, jadi jika Anda mengatur hal-hal yang korup, Anda dapat memulihkannya dari salinan lokal seseorang. Jika Anda memiliki tim besar, kemungkinan ada cukup uang untuk repo yang dihosting di suatu tempat.
rdrey

75
Saya telah kembali ke halaman ini lebih dari lima kali untuk menggunakan urutan perintah yang tepat ini. Saya tidak akan pernah menghafalnya, tapi terima kasih telah menyediakannya!
Jeremy Mack

32
@ Jo: Tidak cukup ghetto.
Ates Goral

128

Cara yang tepat untuk melakukan ini adalah menggunakan git-remote-dropbox: https://github.com/anishathalye/git-remote-dropbox

Membuat repo kosong Anda sendiri di Dropbox menyebabkan banyak masalah. Anish (pencipta perpustakaan) menjelaskan yang terbaik :

Penyebab utama masalah ini adalah bahwa klien desktop Dropbox dirancang untuk menyinkronkan file, bukan repositori Git. Tanpa penanganan khusus untuk repositori Git, ia tidak mempertahankan jaminan yang sama seperti Git. Operasi pada repositori jarak jauh tidak lagi bersifat atomik, dan operasi bersamaan atau pengaturan waktu yang tidak beruntung dengan sinkronisasi dapat menghasilkan repositori yang rusak.

Remote Git tradisional menjalankan kode di sisi server untuk membuat ini berfungsi dengan baik, tetapi kami tidak dapat melakukannya.

Solusi: Dimungkinkan untuk menyelesaikan ini dengan benar. Adalah mungkin untuk menggunakan Git dengan Dropbox dan memiliki jaminan keamanan dan konsistensi yang sama dengan remote Git tradisional, bahkan ketika ada banyak pengguna dan operasi bersamaan!

Untuk seorang pengguna, ini sesederhana menggunakan git-remote-dropbox, sebuah bantuan jarak jauh Git yang bertindak sebagai jembatan dua arah transparan antara Git dan Dropbox dan mempertahankan semua jaminan dari remote Git tradisional. Bahkan aman untuk digunakan dengan folder bersama, sehingga dapat digunakan untuk kolaborasi (yay repo pribadi tak terbatas dengan kolaborator tak terbatas!).

Dengan bantuan jarak jauh, dimungkinkan untuk menggunakan Dropbox sebagai remote Git dan terus menggunakan semua perintah Git biasa seperti git clone, git pull, dan git push, dan semuanya akan berjalan seperti yang diharapkan.


8
Saya senang melihat seseorang memposting tentang git-remote-dropbox pada pertanyaan StackOverflow ini. Saya ingin tahu apakah ada cara untuk mendapatkan respons ini lebih dekat ke atas. Metode yang direkomendasikan oleh jawaban yang diterima saat ini cukup berbahaya dan dapat mengakibatkan korupsi repositori.
fwenom

1
itu keren sekali. saya pasti akan memeriksanya. tetapi ketika saya pindah dari satu kotak dev ke yang lain, dan ingin terus bekerja pada repo yang disinkronkan, metode ini hanya akan berfungsi jika saya selalu melakukan pekerjaan saya ketika saya meninggalkan mesin A, dan ingin mengambil di mana saya tinggalkan di mesin B. apakah saya benar? jika demikian, ini tidak ideal, karena akan mengarah pada kesibukan komitmen "sementara", yang orang dapat berargumen akan mencemari sejarah komit repo. mungkin saya tidak bisa mendapatkan kue dan memakannya juga!
bhu Boue vidya

1
@bhuBouevidya Tidak itu tidak benar. Anda tidak perlu melakukan pekerjaan Anda untuk perubahan dengan disinkronkan. Selama file disimpan, file akan disinkronkan. Pada dasarnya jika Anda memiliki banyak file yang dimodifikasi di satu mesin, modifikasi akan disinkronkan ke yang lain karena Dropbox hanya peduli tentang apa yang telah disimpan ke disk.
clu

2
@ clu: Ya, Anda harus melakukan pekerjaan Anda dan mendorong. Semua yang dilakukan git-remote-dropbox adalah bertindak sebagai penolong jarak jauh git. Sama seperti remote lainnya, komit lokal Anda tidak akan didorong ke jarak jauh sampai push selesai. Cara untuk mendapatkan file yang dimodifikasi secara lokal ke repositori lokal sehingga mereka dapat didorong adalah dengan melakukan komit. Dropbox tidak akan tahu apa-apa tentang file Anda yang tidak ada di repositori.
Semut

2
Hanya ingin tahu apakah git-remote-dropbox adalah cross-platform ... Saya melihatnya menggunakan python, dan saya tahu beberapa hal python lain untuk Dropbox bukan cross-platform, misalnya pada OS X hal-hal baris perintah tidak kompatibel.
Michael

89

Jawaban ini didasarkan pada Mercurial pengalaman , bukan Git, tetapi pengalaman ini mengatakan menggunakan Dropbox dengan cara ini meminta repositori yang korup jika bahkan ada kemungkinan Anda akan memperbarui repositori berbasis Dropbox yang sama dari mesin yang berbeda di berbagai waktu (Mac, Unix, Windows dalam kasus saya).

Saya tidak memiliki daftar lengkap tentang hal-hal yang dapat salah, tetapi inilah contoh spesifik yang menggigit saya. Setiap mesin memiliki gagasan sendiri tentang karakter akhir baris dan bagaimana karakter huruf besar / kecil ditangani dalam nama file. Dropbox dan Git / Mercurial menangani ini sedikit berbeda (saya tidak ingat perbedaan persisnya). Jika Dropbox memperbarui repositori di belakang repositori Git / Mercurial, presto, broken. Ini terjadi segera dan tidak terlihat, sehingga Anda bahkan tidak tahu repositori Anda rusak sampai Anda mencoba memulihkan sesuatu darinya.

Setelah menggali dari satu kekacauan melakukan hal-hal seperti ini, saya telah menggunakan resep berikut ini dengan sukses besar dan tidak ada tanda-tanda masalah. Cukup pindahkan repositori Anda dari Dropbox. Gunakan Dropbox untuk yang lainnya; dokumentasi, file JAR , apa pun yang Anda suka. Dan gunakan GitHub (Git) atau Bitbucket (Mercurial) untuk mengelola repositori itu sendiri. Keduanya gratis sehingga ini tidak menambah biaya, dan masing-masing alat sekarang memainkan kekuatannya.

Menjalankan Git / Mercurial di atas Dropbox tidak menambah apa pun kecuali risiko. Jangan lakukan itu.


13
Saya merasa bahwa repositori git cukup kuat untuk tidak merusak dirinya sendiri. Pengalaman saya (penggunaan lebih dari setahun, kebanyakan pengguna tunggal, lintas platform, lintas komputer, banyak pengembang), adalah bahwa repo git tidak mudah rusak. Di git, hanya informasi yang ditambahkan ke repositori, file-file yang ada dibiarkan sendiri 99,9% dari waktu (file yang bisa berubah-ubah sebagian besar mudah diperiksa secara manual). Saya kadang-kadang melihat kasus-kasus di mana penunjuk cabang ditimpa, tetapi ini dapat dengan mudah dilihat (yaitu "cabang (salinan yang bertentangan XXX)") dan dihapus (sebenarnya tidak diperlukan perbaikan nyata, sebenarnya).
Egon

1
@ tc: Anda benar, selama pengumpulan sampah, informasi yang tidak dapat dijangkau dihapus di git. Namun, saya kira bahwa untuk sebagian besar kasus praktis, ini tidak membahayakan ketahanan: hanya informasi yang tidak dapat dijangkau yang lebih tua dari 2 minggu yang terpengaruh (yang merupakan waktu yang cukup bagi DropBox untuk menyinkronkan). Dan pada saat konflik seperti itu, saya curiga sebagian besar informasi akan tersedia baik dalam bentuk paket maupun paket.
Egon

Saya pikir skenario berbagi kode tanpa repo pusat (dijelaskan dalam jawaban di bawah) akan menyelamatkan satu dari kemungkinan korupsi karena pembaruan bersamaan ke direktori di dropbox. Jika seseorang membutuhkan repo pusat, itu bisa dikelola secara terpisah (dan kehabisan dropbox); dropbox akan menyimpan repo kerja pribadi (yang juga nyaman karena Anda dapat memperbarui / menarik dari waktu ke waktu dari repo sumber orang lain di tim Anda yang menjadi dasar pekerjaan Anda). (Saya benar-benar mempertimbangkan menggunakan darcs dalam pengaturan seperti itu.)
imz - Ivan Zakharyaschev

5
+1 Jika Anda tidak ingin meng-host repositori Anda di tempat umum, gunakan Bitbucket , repo pribadi gratis untuk tim hingga 5 pengguna.
Christian Specht

Satu hal yang saya perhatikan antara mesin Windows dan mesin OSX adalah izin file dapat menyebabkan masalah yang berbeda. Anda dapat mematikan izin di Git menggunakan: "git config core.fileMode false"
devdrc

16

Terkait dengan tim kecil yang menggunakan Dropbox:

Jika setiap pengembang memiliki repositori kosong yang bisa ditulisi di Dropbox, yang hanya menarik pengembang lain, maka ini memfasilitasi pembagian kode tanpa risiko korupsi!

Kemudian jika Anda ingin 'arus utama' terpusat, Anda dapat meminta satu pengembang mengelola semua dorongan dari repo mereka sendiri.


1
Sangat bagus! Juga, untuk melindungi korupsi repo dari beberapa penulisan, Anda dapat dengan mudah membuat repo GANDA dan hanya menyinkronkan folder .git mereka! Yang Anda butuhkan sesaat - adalah menarik dari asal yang diinginkan! Pria P-to-P yang hebat! Anda memahami filosofi git yang didesentralisasi!
Brian Haak

16

Saya tidak ingin meletakkan semua proyek saya di bawah satu repositori Git, saya juga tidak ingin masuk dan menjalankan kode ini untuk setiap proyek tunggal, jadi saya membuat skrip Bash yang akan mengotomatiskan proses. Anda dapat menggunakannya pada satu atau beberapa direktori - sehingga dapat melakukan kode dalam posting ini untuk Anda atau dapat melakukannya pada beberapa proyek sekaligus.

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

Saya tidak berpikir bahwa menggunakan Git dan Dropbox adalah cara untuk pergi ... Pikirkan saja fitur-fiturnya dari keduanya:

Git:

  • Memungkinkan Anda memiliki repositori pusat
  • Memungkinkan Anda memiliki repositori sendiri dengan perubahan Anda sendiri
  • Memungkinkan Anda mengirim dan menerima perubahan dari repositori pusat
  • Mengizinkan beberapa orang mengubah file yang sama dan mereka menggabungkannya atau meminta Anda untuk menggabungkannya jika tidak bisa melakukannya
  • Memiliki klien web dan desktop untuk memungkinkan akses ke repositori pusat

Dropbox:

  • Menyimpan segala sesuatu di repositori pusat
  • Memungkinkan Anda memiliki versi file Anda sendiri di server
  • Memaksa Anda untuk mengirim dan menerima perubahan dari repositori pusat
  • Jika beberapa orang mengubah file yang sama, file pertama yang dikomit diganti dengan yang kemudian dikomit, dan tidak ada penggabungan terjadi yang menyusahkan (dan tentunya kerugian terbesarnya)
  • Memiliki klien web dan desktop untuk memungkinkan akses ke repositori pusat.

Dan jika Anda khawatir berbagi beberapa file Anda, mengapa tidak mengartikannya? Dan kemudian Anda bisa mendapatkan keuntungan terbesar dari Dropbox untuk Git, yaitu memiliki file publik dan pribadi ...


Dropbox hanyalah pilihan bagus untuk repo pusat. Jika ditempatkan di folder bersama itu bahkan berfungsi untuk grup.
mac

1
Ya, tetapi Anda tidak akan memiliki fitur penggabungan yang sama seperti di git, bahkan jika seseorang mengedit file yang sama dengan Anda, dan ia menyimpan file setelah Anda, perubahan Anda akan hilang, kecuali jika Anda pergi ke antarmuka web dan unduh versi lama (versi Anda).
Coyote21

8
Ini salah. Dropbox tidak menjatuhkan konflik. Ini mangles nama file dari satu edit, dan menggunakan yang lain untuk kontinuitas. Anda dapat menggabungkannya sendiri secara manual jika diinginkan. Ini kompromi yang baik, dan tidak kehilangan data. dropbox.com/help/36
Clueless

6
Ya tetapi karena ini adalah tentang kode, semakin sedikit waktu yang saya habiskan untuk menggabungkan file, semakin banyak kode yang dapat saya hasilkan, dan dalam basis kode normal dapat ratusan konflik sekaligus, tergantung dari dimensi proyek, dan itu akan menjadi mimpi buruk untuk bergabung kemudian satu per satu, bahkan dengan bantuan alat gabungan seperti WinMerge (atau yang serupa).
Coyote21

15

Sekarang tahun 2015, dan pada tiga hari yang lalu, alat baru berdasarkan Dropbox API v2 telah dibuat untuk menggunakan git di Dropbox dengan aman. Ini bekerja melawan API daripada menggunakan klien desktop, dan dengan benar menangani beberapa dorongan simultan ke repositori yang dihosting di folder bersama.

Setelah dikonfigurasi, ini memungkinkan seseorang untuk mengatur git remote persis seperti git remote lainnya.

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

2
Alangkah baiknya jika beberapa mod akan menggabungkan semua pertanyaan git-dengan-dropbox di stackexchange di bawah superthread yang menyebutkan hal-hal terbaru terlebih dahulu.
Blair Houghton

9

Saya menggunakan Mercurial (atau Git) + TrueCrypt + Dropbox untuk cadangan jarak jauh terenkripsi .

Yang paling keren adalah Dropbox TIDAK menyinkronkan seluruh wadah TrueCrypt jika Anda memodifikasi sebagian kecil kode Anda. Waktu sinkronisasi kira-kira sebanding dengan jumlah perubahan. Meskipun dienkripsi, kombinasi TrueCrypt + Dropbox membuat penggunaan blok cipher + sinkronisasi tingkat blok menjadi sangat baik.

Kedua, wadah terenkripsi monolitik tidak hanya menambah keamanan, tetapi juga mengurangi kemungkinan korupsi penyimpanan .

Perhatian: Namun Anda harus sangat berhati-hati untuk tidak memasang wadah saat Dropbox berjalan. Bisa juga menyusahkan untuk menyelesaikan konflik jika 2 klien berbeda check-in versi yang berbeda ke wadah. Jadi, praktis hanya untuk satu orang yang menggunakannya untuk cadangan, bukan untuk tim.

Mendirikan:

  • Buat wadah Truecrypt (beberapa Gigabyte baik-baik saja)
  • Di bawah Truecrypt preferensi, hapus centang preserve modification timestamp*.
  • Buat repo seperti yang disebutkan di atas oleh Dan ( https://stackoverflow.com/a/1961515/781695 )

Pemakaian:

  • Keluar dari Dropbox
  • Pasang wadah, dorong perubahan Anda, lepaskan
  • Jalankan dropbox

PS Hapus centang pada preserve modification timestampdropbox yang memberitahu bahwa file telah dimodifikasi dan harus disinkronkan. Perhatikan bahwa pemasangan wadah memodifikasi stempel waktu meskipun Anda tidak mengubah file apa pun di dalamnya. Jika Anda tidak ingin itu terjadi, cukup pasang volume asread-only


Apakah akan jauh berbeda jika menggunakan gambar file .dmg yang dienkripsi macos , apakah waktu sinkronisasi masih kasar sebanding dengan perubahan?
IBrum

@IBrum Maaf, saya belum mencobanya dengan file .dmg
pengguna

7

Saya suka jawabannya oleh Dan McNevin! Saya menggunakan Git dan Dropbox bersama sekarang juga, dan saya menggunakan beberapa alias di .bash_profile saya sehingga alur kerja saya terlihat seperti ini:

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

Ini adalah alias saya:

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'

Saya mungkin tidak akan menggunakan hal terakhir sebagai alias, melainkan skrip shell. Kalau tidak, saya sangat suka ini. Kredit ekstra untuk penggunaan awk.
pauljohn32

6

Kami menggunakan metode ini (membuat repositori telanjang di Dropbox) pada folder berbagi .

Sekelompok kecil pengembang dapat menarik dari repositori kosong yang disinkronkan dan membuat klon lokal. Setelah unit kerja selesai, kami mendorong kembali ke asal.

Satu hal yang saya lewatkan adalah cara yang baik untuk mengirim e-mail dengan informasi perubahan-set begitu dorongan ke asal terjadi. Kami menggunakan Google Wave untuk melacak perubahan secara manual.


81
Seseorang menggunakan Google Wave?
Kristopher Johnson

6

Saya telah menggunakan Mercurial dengan cara yang disarankan dan mendesak Anda untuk berhati-hati, terutama jika ada mesin yang berbeda. Forum Dropbox penuh dengan keluhan masalah nama file misterius yang muncul secara spontan. Hg (dan saya kira Git) tidak akan melihat atau mengeluh selama checkin rutin dan Anda hanya akan mendengar tentang korupsi ketika mengeluhkan repo yang korup ketika Anda mencoba menggunakannya secara nyata. Kabar buruk. Seandainya saya bisa lebih spesifik tentang masalah dan penyelesaiannya; Saya masih mencoba menggali dari kekacauan ini sendiri.


Saya memiliki masalah yang sama dengan lincah
Tomba

git melakukan jauh lebih banyak memeriksa korupsi daripada yang lain dengan desain. Jadi setidaknya Anda akan tahu kapan itu terjadi dan dapat memperbaiki masalahnya.
Anders

6

Ada juga proyek open source (kumpulan skrip [Linux, Mac, Win] lintas platform) yang melakukan semua rincian rumit dari manajemen repositori dengan sejumlah (3-4) perintah.

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

Penggunaan sampel adalah:

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

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

Setelah itu penggunaan normal git:

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

Periksa wiki proyek dan manual untuk referensi perintah lengkap dan tutorial.


4

Saya menyimpan repo non-Github saya di Dropbox. Satu peringatan yang saya temui adalah menyinkronkan setelah menginstal ulang. Dropbox akan mengunduh file terkecil terlebih dahulu sebelum pindah ke yang lebih besar. Tidak masalah jika Anda mulai di malam hari dan kembali setelah akhir pekan :-)

Utas saya - http://forums.dropbox.com/topic.php?id=29984&replies=6


4

Sekarang pada tahun 2014, saya telah menggunakan Git dan Dropbox selama sekitar satu setengah tahun tanpa masalah. Beberapa poin:

  • Semua mesin saya menggunakan Dropbox ada di Windows, versi yang berbeda (7 hingga 8) + 1 mac.
  • Saya tidak membagikan repositori dengan orang lain, jadi saya satu-satunya yang memodifikasinya.
  • git push mendorong ke repositori jarak jauh, sehingga jika pernah rusak, saya dapat dengan mudah memulihkannya.
  • Saya harus membuat alias C:\Usersdengan mklink /D link targetkarena beberapa perpustakaan diarahkan ke lokasi absolut.

3

Saya suka jawaban terpilih oleh Dan McNevin. Saya akhirnya melakukan urutan perintah git terlalu banyak dan memutuskan untuk membuat skrip. Jadi begini:

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

Script hanya membutuhkan nama proyek. Ini akan menghasilkan repositori git di ~/Dropbox/git/bawah nama yang ditentukan dan akan mendorong seluruh isi direktori saat ini ke cabang master asal yang baru dibuat. Jika lebih dari satu nama proyek diberikan, argumen nama proyek paling kanan akan digunakan.

Secara opsional, argumen perintah -r menentukan cabang jarak jauh yang akan mendorong ke master asal. Lokasi master asal proyek juga dapat ditentukan dengan argumen -m. File .gitignore default juga ditempatkan di direktori cabang jauh. Default file direktori dan .gitignore ditentukan dalam skrip.


3

Pendekatan lain:

Semua jawaban sejauh ini, termasuk jawaban @Dan yang paling populer, membahas gagasan menggunakan Dropbox untuk memusatkan repositori bersama alih-alih menggunakan layanan yang berfokus pada git seperti github, bitbucket, dll.

Tetapi, karena pertanyaan awal tidak secara spesifik menjelaskan arti dari menggunakan "Git dan Dropbox secara efektif", mari kita bekerja dengan pendekatan lain: "Menggunakan Dropbox untuk menyinkronkan hanya worktree."

Cara memiliki langkah-langkah ini:

  1. di dalam direktori proyek, satu menciptakan .gitdirektori kosong (misalnya mkdir -p myproject/.git)

  2. batalkan sinkronisasi .gitdirektori di Dropbox. Jika menggunakan Aplikasi Dropbox: buka Preferensi, Sinkronisasi, dan "pilih folder yang akan disinkronkan", di mana .gitdirektori tersebut harus tidak ditandai. Ini akan menghapus .gitdirektori.

  3. jalankan git initdi direktori proyek

Ini juga berfungsi jika .git sudah ada, maka hanya lakukan langkah 2. Dropbox akan menyimpan salinan file git di situs web.

Langkah 2 akan menyebabkan Dropbox tidak menyinkronkan struktur sistem git, yang merupakan hasil yang diinginkan untuk pendekatan ini.

Mengapa seseorang menggunakan pendekatan ini?

  • Perubahan yang belum didorong akan memiliki cadangan Dropbox, dan akan disinkronkan di seluruh perangkat.

  • Jika Dropbox mengacaukan sesuatu saat menyinkronkan antar perangkat, git statusdan git diffakan mudah untuk menyelesaikannya.

  • Ini menghemat ruang di akun Dropbox (seluruh riwayat tidak akan disimpan di sana)

  • Ini menghindari kekhawatiran yang diangkat oleh @dubek dan @Ates dalam komentar pada jawaban @ Dan, dan kekhawatiran oleh @clu pada jawaban lain .

Keberadaan remote di tempat lain (github, dll.) Akan berfungsi dengan baik dengan pendekatan ini.

Bekerja di cabang yang berbeda membawa beberapa masalah, yang perlu dijaga:

  • Salah satu masalah potensial adalah memiliki Dropbox (yang tidak perlu?) Menyinkronkan banyak file secara potensial ketika seseorang memeriksa cabang yang berbeda.

  • Jika dua atau lebih perangkat Dropbox yang disinkronkan memiliki cabang yang berbeda diperiksa, perubahan yang tidak dilakukan untuk kedua perangkat dapat hilang,

Salah satu cara mengatasi masalah ini adalah dengan menggunakan git worktreeuntuk menjaga checkout cabang di direktori yang terpisah.


Sebagai seseorang yang mengerjakan file yang bagus untuk kontrol versi, tetapi juga dapat diedit di iPad (melalui sinkronisasi Dropbox), jawaban ini mencakup kasus penggunaan itu.
Vagari

Tindak lanjut cepat, perilaku Dropbox saat ini berbeda. Menghapus dan memberitahu Dropbox agar tidak disinkronkan berarti sebaliknya, tetap di cloud, dihapus dari lokal. Tapi ada jawaban superuser dengan solusi. superuser.com/a/1527145/109561 Dalam kasus saya (di Mac) yang ditandai sebagai file yang diabaikan xattr -w com.dropbox.ignored 1 /path/to/somewhere,.
Vagari

3

Untuk 2 sen saya, Dropbox hanya masuk akal untuk penggunaan pribadi di mana Anda tidak ingin repot-repot mendapatkan host repo pusat. Untuk pengembangan profesional apa pun Anda mungkin akan menciptakan lebih banyak masalah daripada yang akan Anda selesaikan, seperti yang telah disebutkan beberapa kali di utas, Dropbox tidak dirancang untuk kasus penggunaan ini. Yang mengatakan, metode yang sangat aman untuk membuang repositori di Dropbox tanpa plugin atau alat pihak ketiga adalah dengan menggunakan bundel. Saya memiliki alias berikut .gitconfiguntuk menghemat pengetikan:

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

Contoh:

# 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

Saya telah menghadapi masalah yang sama dan telah membuat skrip kecil untuk hal yang sama. Idenya adalah menggunakan Dropbox dengan Git sesederhana mungkin. Saat ini, saya telah dengan cepat mengimplementasikan kode Ruby , dan saya akan segera menambahkan lebih banyak.

Script dapat diakses di https://github.com/nuttylabs/box-git.


0

Tanpa menggunakan alat integrasi pihak ketiga, saya bisa sedikit meningkatkan kondisinya dan menggunakan DropBox dan layanan cloud disk serupa lainnya seperti SpiderOak dengan Git.

Tujuannya adalah untuk menghindari sinkronisasi di tengah-tengah modifikasi file-file ini, karena dapat mengunggah status parsial dan kemudian akan mengunduhnya kembali, benar-benar merusak kondisi git Anda.

Untuk menghindari masalah ini, saya melakukan:

  1. Bundel indeks git saya dalam satu file menggunakan git bundle create my_repo.git --all.
  2. Tetapkan penundaan untuk pemantauan file, misalnya 5 menit, bukan sesaat. Ini mengurangi kemungkinan DropBox menyinkronkan keadaan parsial di tengah perubahan. Ini juga sangat membantu saat memodifikasi file pada disk cloud saat itu juga (seperti dengan aplikasi penyimpanan catatan instan).

Ini tidak sempurna karena tidak ada jaminan itu tidak akan mengacaukan negara git lagi, tetapi itu membantu dan untuk saat ini saya tidak mendapatkan masalah.


0

Di MacOS Anda juga dapat menghentikan Dropbox, melakukan perubahan, lalu meluncurkan kembali Dropbox. Saya menggunakan kombinasi berikut dan cukup senang dengan itu:

Di keduanya (direktori proyek yang dikelola git lokal dan repositori git jarak jauh Anda yang terletak di Dropbox) jalankan perintah berikut untuk menonaktifkan pengemasan otomatis (yang merupakan masalah utama dengan sinkronisasi dropbox)

git config --global gc.auto 0

Kemudian dari waktu ke waktu, kompres repositori dengan dropbox dinonaktifkan. Misalnya saya melakukan hal berikut dalam skrip bash-build-saya setiap kali saya membuat rilis baru dari aplikasi saya.

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\""
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.