Python: fatal: bukan repositori git Berhenti di batas sistem file (GIT_DISCOVERY_ACROSS_FILESYSTEM tidak disetel)

Saat aku berlari

proc = subprocess.Popen(['git', 'add', '-A'], stdout=subprocess.PIPE)

Saya mendapatkan kesalahan ini

fatal: not a git repository (or any parent up to mount point /media)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

Tapi berlari

os.system('git add -A')

Melakukan pekerjaannya dengan sempurna.

Jika menurut Anda folder tersebut tidak memiliki file .git,

proc = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE)

menunjukkan bahwa itu sudah ada di cwd.

Mengapa Popen tidak dapat menampilkan file, juga tidak dapat melakukan komit sementara os.system melakukan keduanya?


Pembaruan:

Ini MWE saya yang gagal

import subprocess
import os

cwd = os.getcwd()
proj_path = os.path.join(cwd, 'newproj')
os.makedirs(proj_path)
os.chdir(proj_path)
proc = subprocess.Popen(['git', 'init'], stdout=subprocess.PIPE)
proc = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE)
print(proc.stdout.read().decode('ascii'))
proc = subprocess.Popen(['git', 'add', '-A'], stdout=subprocess.PIPE)
out, err = proc.communicate()
if err:
    print('Error:\n', err.decode())
print(out.decode('ascii'))

keluaran

.
..
.git

fatal: not a git repository (or any parent up to mount point /media)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

person mercury    schedule 10.02.2021    source sumber
comment
Apakah ini membantu? stackoverflow.com/questions/31766655/   -  person lesmana    schedule 11.02.2021
comment
@lesmana, kalau cwd tidak diset, lalu kenapa ls -a bisa berfungsi di cwd?   -  person mercury    schedule 11.02.2021
comment
Itu aneh. Apakah Anda memiliki contoh minimal yang dapat direproduksi?   -  person torek    schedule 11.02.2021
comment
@torek, Menambahkan MWE.   -  person mercury    schedule 11.02.2021
comment
saya tidak yakin bagaimana hal itu akan membantu. pertanyaan lainnya serupa karena git add tidak berfungsi. itu adalah tembakan dalam kegelapan. saya tidak dapat mereproduksi masalah Anda dan bingung. ini terjadi sebelum Anda menambahkan contoh kerja minimal. sekarang jelas bahwa ini adalah kondisi balapan. Anda harus berkomunikasi atau menunggu setiap subproses.   -  person lesmana    schedule 11.02.2021
comment
@lesmana, tidak, pertanyaannya tidak sama. di pertanyaan lain masalahnya adalah ketahanan git filter-branch di bawah direktori jaringan.   -  person mercury    schedule 11.02.2021


Jawaban (1)


Versi Python saya sedikit tertinggal dari versi Anda, namun saya dapat mereproduksi masalahnya, yang sebenarnya cukup sederhana:

proc = subprocess.Popen(['git', 'init'], stdout=subprocess.PIPE)
proc = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE)
print(proc.stdout.read().decode('ascii'))
proc = subprocess.Popen(['git', 'add', '-A'], stdout=subprocess.PIPE)

Perhatikan tidak adanya panggilan ke proc.wait() atau serupa. Ini berarti kami melakukan spin off git init dan jangan menunggu.

Selanjutnya kita jalankan ls -a. Di sini kita menunggu sebentar—cukup lama untuk membaca outputnya ke EOF, yang sebenarnya relatif lama karena EOF hanya terjadi karena ls -a selesai—sementara git init masih berjalan. Bergantung pada seberapa cepat git init melakukan tugasnya, kami mungkin menemukan direktori .git di sini atau tidak. Jika ini memakan waktu cukup lama, git init mungkin juga akan selesai. Untungnya git init di sistem saya cukup lambat dibandingkan ls -a sehingga saya melihat efek yang sama seperti Anda. (Yah, saya menemukan bahwa direktori .git terkadang belum ada.)

Terakhir, kita jalankan git add -A. git init mungkin masih berjalan atau tidak. Ternyata, direktori ini masih berjalan, dan belum cukup jauh untuk menjadikan direktori .git sebagai repositori Git. Jadi git add -A mengeluh, dengan kesalahan yang Anda amati.

Jika kita menambahkan proc.wait() tepat setelah git init—idealnya, kita harus memeriksa kode pengembalian, atau cukup menggunakan subprocess.check_call atau subprocess.run di sini—masalahnya akan hilang.

person torek    schedule 11.02.2021