Pertanyaan Bagaimana Anda menyimpan file yang tidak terlacak?


Saya memiliki perubahan ke file, plus file baru, dan ingin menggunakan simpanan git untuk menyimpannya saat saya beralih ke tugas lain. Tapi simpanan git dengan sendirinya stash hanya perubahan ke file yang ada; file baru tetap di pohon kerja saya, mengacaukan pekerjaan saya di masa depan. Bagaimana saya menyimpan file yang tidak terlacak ini?


932
2018-05-07 15:54


asal


Jawaban:


Perbarui 17 Mei 2018:

Versi baru git sekarang miliki git stash --all yang menyimpan semua file, termasuk file yang tidak terlacak dan diabaikan.
git stash --include-untracked tidak lagi menyentuh file yang diabaikan (diuji pada git 2.16.2).

Jawaban asli di bawah ini:

Peringatan, melakukan hal ini akan secara permanen menghapus file Anda jika Anda memiliki direktori / * entri di file gitignore Anda.

Mulai dari versi 1.7.7 yang bisa Anda gunakan git stash --include-untracked atau git stash save -u untuk menyimpan file yang tidak terlacak tanpa mementaskannya.

Tambahkan (git add) file dan mulai melacaknya. Lalu simpan. Karena seluruh isi file baru, mereka akan disembunyikan, dan Anda dapat memanipulasinya seperlunya.


1180
2018-05-07 16:02



Mulai dari git 1.7.7, git stash menerima --include-untracked opsi (atau tangan pendek -u). Untuk memasukkan file yang tidak terlacak dalam simpanan Anda, gunakan salah satu dari perintah berikut:

git stash --include-untracked
git stash -u

Peringatan, melakukan hal ini akan secara permanen menghapus file Anda jika Anda memiliki direktori / * entri di file gitignore Anda.


351
2017-07-25 15:49



Tambahkan file ke indeks:

git add path/to/untracked-file
git stash

Seluruh isi indeks, ditambah perubahan tak beraturan pada file yang ada, semuanya akan menjadi simpanan.


55
2018-05-07 15:57



Dalam git bash, membongkar file yang tidak terlacak dicapai dengan menggunakan perintah

git stash --include-untracked

atau

git stash -u

http://git-scm.com/docs/git-stash

git stash menghilangkan file yang tidak terlacak atau tidak di-uncommited dari ruang kerja Anda. Dan Anda dapat mengembalikan simpanan git dengan menggunakan perintah berikut

git stash pop

Ini akan menempatkan file kembali di ruang kerja lokal Anda.

Pengalaman saya

Saya harus melakukan modifikasi pada file gitIgnore saya untuk menghindari perpindahan file .classpath dan .project ke repo jarak jauh. Saya tidak diizinkan memindahkan modifikasi ini. GitIgnore di repo jarak jauh seperti yang sekarang.

File .classpath dan .project penting untuk gerhana - yang merupakan editor java saya.

Saya pertama-tama secara selektif menambahkan sisa file dan berkomitmen untuk pementasan. Namun, dorongan terakhir tidak dapat dilakukan kecuali dimodifikasi. GitIgnore fiels dan file yang tidak terlacak yaitu. .project dan .classpath tidak disimpan.

Saya menggunakan

 git stash 

untuk menyembunyikan file .gitIgnore yang dimodifikasi.

Untuk menyembunyikan file .classpath dan .project, saya menggunakan

git stash --include-untracked

dan itu menghapus file dari ruang kerja saya. Tidak adanya file-file ini menghilangkan kemampuan saya bekerja di lokasi kerja saya di gerhana. Saya melanjutkan dengan menyelesaikan prosedur untuk mendorong file berkomitmen ke remote. Setelah ini berhasil dilakukan, saya menggunakan

git stash pop

Ini menyisipkan file yang sama kembali di ruang kerja saya. Ini memberi saya kemampuan saya untuk bekerja di proyek yang sama dalam gerhana. Semoga ini menyingkirkan kesalahpahaman.


44
2017-08-28 20:46



Seperti telah dikatakan di tempat lain, jawabannya adalah git add berkas. misalnya.:

git add path/to/untracked-file
git stash

Namun, pertanyaannya juga muncul dalam jawaban lain: Bagaimana jika Anda tidak benar-benar ingin menambahkan file? Yah, sejauh yang saya tahu, Anda harus melakukannya. Dan kehendak berikut TIDAK kerja:

git add -N path/to/untracked/file     # note: -N is short for --intent-to-add
git stash

ini akan gagal, sebagai berikut:

path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state

Jadi, apa yang bisa kamu lakukan? Nah, Anda harus benar-benar menambahkan file itu, namun, Anda dapat secara efektif membatalkannya nanti, dengan git rm --cached:

git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop   # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file

Dan kemudian Anda dapat terus bekerja, dalam keadaan yang sama seperti sebelumnya git add (yaitu dengan file yang tidak terlacak disebut path/to/untracked-file; ditambah perubahan lain yang mungkin Anda miliki untuk melacak file).

Kemungkinan lain untuk alur kerja pada ini akan menjadi sesuatu seperti:

git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack

[Catatan: Seperti yang disebutkan dalam komentar dari @mancocapac, Anda mungkin ingin menambahkan --exclude-standard ke git ls-files perintah (jadi, git ls-files -o --exclude-standard).]

... yang juga dapat dengan mudah ditulis - bahkan alias akan melakukannya (disajikan dalam sintaks zsh; sesuaikan sesuai kebutuhan) [juga, saya mempersingkat nama file sehingga semuanya cocok di layar tanpa menggulir ke dalam jawaban ini; merasa bebas untuk mengganti nama file alternatif yang Anda pilih]:

alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'

Perhatikan bahwa yang terakhir mungkin lebih baik sebagai skrip atau fungsi shell, untuk memungkinkan parameter dipasok ke git stash, jika Anda tidak menginginkannya pop tapi apply, dan / atau ingin dapat menentukan simpanan tertentu, daripada hanya mengambil yang teratas. Mungkin ini (bukan alias kedua, di atas) [whitespace dilepas agar pas tanpa bergulir; menambahkan kembali untuk meningkatkan keterbacaan]:

function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}

Catatan: Dalam formulir ini, Anda harus memberikan argumen tindakan serta pengenal jika Anda akan memberikan pengenal simpanan, mis. unstashall apply stash@{1} atau unstashall pop stash@{1}


17
2018-02-06 02:00



Pada git versi 2.8.1: bekerja berikut untuk saya.

Untuk menyimpan file yang dimodifikasi dan tidak terlacak di simpanan tanpa nama

git stash save -u

Untuk menyimpan file yang dimodifikasi dan tidak disimpan dalam simpanan dengan nama

git stash save -u <name_of_stash>

Anda dapat menggunakan pop dan menerapkannya nanti sebagai berikut.

git stash pop

git stash apply stash@{0}

8
2018-02-20 09:23



Saya bisa menyimpan hanya file yang tidak terlacak dengan melakukan:

git stash save "tracked files I'm working on"
git stash save -u "untracked files I'm trying to stash"
git stash pop stash@{1}

Yang terakhir muncul simpanan file yang dilacak, sehingga hanya menyisakan file yang tidak terlacak disimpan.


4
2018-05-06 22:33



Ada beberapa jawaban yang benar di sini, tetapi saya ingin menunjukkan bahwa untuk seluruh direktori baru, 'git add path' akan TIDAK kerja. Jadi, jika Anda memiliki banyak file baru di jalan tak terlacak dan lakukan ini:

git add untracked-path
git stash "temp stash"

ini akan disimpan dengan pesan berikut:

Saved working directory and index state On master: temp stash
warning: unable to rmdir untracked-path: Directory not empty

dan jika jalan tak terlacak adalah satu-satunya jalan yang Anda curi, simpanan "temp stash" akan menjadi simpanan kosong. Cara yang benar adalah dengan menambahkan seluruh jalur, bukan hanya nama direktori (yaitu mengakhiri jalur dengan '/'):

git add untracked-path/
git stash "temp stash"

1
2017-08-19 23:59