Apa praktik terbaik untuk menempatkan beberapa proyek di repositori git? [Tutup]

188

Karena beberapa alasan, saya hanya punya satu repositori untuk digunakan.
Tapi saya punya banyak proyek termasuk javaproyek, php scriptsdan Androidproyek aplikasi.

Sekarang masalah saya adalah, saya harus meletakkannya ke sub-folder yang berbeda di dalam repositori.
Saya menggunakan IDE yang berbeda, Anda tahu, setiap IDE dapat memiliki ruang kerja sendiri.

Siapa yang bisa memberi tahu saya praktik terbaik untuk menyelesaikan masalah?

Dingin
sumber
1
Solusi yang mungkin bisa berupa stackoverflow.com/questions/5514739/… atau stackoverflow.com/a/7931825/828197
Ragnarokkr
2
Kamu tidak sendiri. Saya memiliki kasus serupa dengan repo yang saya gunakan untuk tujuan pembelajaran (contoh: github.com/hopbit/java-sandbox ). Saya tidak ingin membuat repo baru untuk mencoba contoh untuk setiap buku / tutorial baru yang mulai saya baca ...
Łukasz Siwiński
Salah satu alasan Anda ingin melakukan ini adalah jika Anda punya satu proyek yaitu kode produk yang Anda gunakan ke lingkungan runtime seperti pengujian atau produksi. Proyek kedua adalah aplikasi yang menguji sistem (BDD misalnya) proyek pertama. Ada hubungan dekat antara kedua proyek ini dan sekarang Anda dapat mempertahankan / merujuk keseluruhan menggunakan satu repositori url.
Lance Kind
Ringkasan seperti di bawah ini "Git tidak tahu apakah ini bagian dari proyek yang sama atau berbeda"
ahmednabil88

Jawaban:

198

Sementara kebanyakan orang akan memberitahu Anda untuk hanya menggunakan beberapa repositori, saya merasa ada baiknya menyebutkan ada solusi lain.

Solusi 1

Sebuah repositori tunggal dapat berisi beberapa independen cabang, disebut cabang yatim . Cabang-cabang yatim benar-benar terpisah satu sama lain; mereka tidak membagikan sejarah.

git checkout --orphan BRANCHNAME

Ini menciptakan cabang baru, tidak terkait dengan cabang Anda saat ini. Setiap proyek harus di cabang yatim sendiri.

Sekarang untuk alasan apa pun, git perlu sedikit pembersihan setelah checkout anak yatim.

rm .git/index
rm -r *

Pastikan semuanya dilakukan sebelum dihapus

Setelah cabang yatim itu bersih, Anda dapat menggunakannya secara normal.

Solusi 2

Hindari semua kerumitan cabang yatim. Buat dua repositori independen, dan dorong ke remote yang sama. Cukup gunakan nama cabang yang berbeda untuk setiap repo.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
Jacob Groundwater
sumber
Terima kasih banyak, itu seharusnya bisa menyelesaikan masalah saya. Sebenarnya, dua solusi menggunakan cabang untuk mengadakan proyek yang berbeda.
Stony
6
Saya tidak yakin saya mengerti solusi 2. Apakah Anda mengatakan Anda mengkomit semua file .git ke master git repo? Apa perbedaan antara menggunakan banyak cabang yatim vs menggunakan banyak cabang?
Nate
14
@Nate Apa yang dia katakan adalah ini: buat dua repositori lokal yang terpisah , lalu dorong keduanya ke repositori jarak jauh yang sama di GitHub.
The Guy with The Hat
1
Terima kasih @TheGuywithTheElfHat. Sekarang saya melihatnya lagi (9 bulan kemudian) tampak jelas bagi saya. Solusi 2 masih membuat cabang yatim tetapi saya bisa melihat bagaimana metode ini lebih mudah untuk ditangani.
Nate
21
Solusi 2 perlu penjelasan lebih lanjut
eC Droid
19

Solusi 3

Ini untuk menggunakan direktori tunggal untuk banyak proyek. Saya menggunakan teknik ini untuk beberapa proyek yang berhubungan erat di mana saya sering perlu menarik perubahan dari satu proyek ke proyek lainnya. Ini mirip dengan ide cabang yatim tetapi cabang tidak perlu menjadi yatim. Cukup mulai semua proyek dari keadaan direktori kosong yang sama.

Mulai semua proyek dari satu direktori kosong yang dikomit

Jangan berharap keajaiban dari solusi ini. Seperti yang saya lihat, Anda akan selalu mengalami gangguan dengan file yang tidak terlacak. Git tidak benar-benar tahu apa yang harus dilakukan dengan mereka dan jadi jika ada file perantara yang dihasilkan oleh kompiler dan diabaikan oleh file .gitignore Anda, kemungkinan mereka akan dibiarkan menggantung beberapa waktu jika Anda mencoba bertukar dengan cepat antara - misalnya - proyek perangkat lunak Anda dan proyek tesis PH.D.

Namun inilah rencananya. Mulai ketika Anda harus memulai proyek git apa pun, dengan melakukan repositori kosong, dan kemudian mulai semua proyek Anda dari keadaan direktori kosong yang sama. Dengan begitu Anda yakin bahwa dua banyak file cukup independen. Juga, berikan cabang Anda nama yang tepat dan jangan malas hanya menggunakan "master". Proyek Anda harus terpisah sehingga beri mereka nama yang sesuai.

Git melakukan (dan karenanya tag dan cabang) pada dasarnya menyimpan keadaan direktori dan subdirektori dan Git tidak tahu apakah ini adalah bagian dari proyek yang sama atau berbeda sehingga benar-benar tidak ada masalah bagi git menyimpan proyek yang berbeda dalam repositori yang sama. Masalahnya kemudian adalah Anda menghapus file yang tidak terlacak dari satu proyek saat menggunakan yang lain, atau memisahkan proyek nanti.

Buat repositori kosong

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Mulai proyek Anda dari kosong.

Kerjakan satu proyek.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Mulai proyek lain

kapanpun kamu suka.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

Beralih bolak-balik

Kembali dan maju antar proyek kapan pun Anda suka. Contoh ini kembali ke proyek perangkat lunak catur.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

File yang tidak dilacak menjengkelkan

Namun Anda akan terganggu oleh file yang tidak terlacak saat bertukar antar proyek / cabang.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

Ini bukan masalah yang tidak dapat diatasi

Diurutkan berdasarkan definisi, git tidak benar-benar tahu apa yang harus dilakukan dengan file yang tidak terlacak dan terserah Anda untuk mengatasinya. Anda dapat menghentikan file yang tidak dilacak untuk dibawa-bawa dari satu cabang ke cabang lainnya sebagai berikut.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

Dengan memastikan bahwa direktori itu kosong sebelum memeriksa proyek baru kami, kami memastikan tidak ada menggantung file yang tidak terlacak dari proyek lain.

Penyempurnaan

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

Jika tanggal yang sama ditentukan setiap kali melakukan repositori kosong, maka komit kosong yang dibuat secara independen dapat memiliki kode SHA1 yang sama. Ini memungkinkan dua repositori untuk dibuat secara independen dan kemudian digabung bersama menjadi satu pohon dengan akar yang sama dalam satu repositori nanti.

Contoh

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Hasil

Diagram repositori gabungan

Gunakan subdirektori per proyek?

Mungkin juga membantu jika Anda menyimpan proyek Anda di subdirektori jika memungkinkan, misalnya alih-alih memiliki file

chess.prog
philosophy_doctorate.txt 

memiliki

chess/chess.prog
thesis/philosophy_doctorate.txt 

Dalam hal ini file perangkat lunak Anda yang tidak terlacak akan menjadi chess/untracked_software_file.prog. Ketika bekerja di thesisdirektori Anda tidak boleh diganggu oleh file program catur yang tidak terlacak, dan Anda mungkin menemukan kesempatan ketika Anda dapat bekerja dengan senang hati tanpa menghapus file yang tidak terlacak dari proyek lain.

Juga, jika Anda ingin menghapus file yang tidak terlacak dari proyek lain, itu akan lebih cepat (dan lebih rentan untuk kesalahan) untuk membuang direktori yang tidak diinginkan daripada menghapus file yang tidak diinginkan dengan memilih masing-masing.

Nama cabang dapat menyertakan karakter '/'

Jadi, Anda mungkin ingin memberi nama cabang Anda sesuatu seperti

project1/master
project1/featureABC
project2/master
project2/featureXYZ
Ivan
sumber