git.push() работает, но фиксация на github пуста
Я использую isomorphic-git в браузере (на данный момент Chrome), чтобы попытаться сохранить код на github
После клонирования частного репозитория github я пытаюсь добавить в него новые файлы, выполнить фиксацию и отправить его обратно в тот же частный репозиторий Github.
Но когда я проверяю Github, коммиты записываются, но полностью пусты!
Это похоже на добавленные мной файлы, которые по какой-то причине не связаны с фиксацией, и коммит не знает о них...
Я получаю ответ ОК от нажатия:
{
headers: {
cache-control: "no-cache, max-age=0, must-revalidate"
content-type: "application/x-git-receive-pack-result"
date: "Tue, 04 Aug 2020 04:58:59 GMT"
expires: "Fri, 01 Jan 1980 00:00:00 GMT"
pragma: "no-cache"
server: "cloudflare"
vary: "Accept-Encoding"
x-github-request-id: "CE24:0E4C:16E8D5:2B275C:5F28EB11"
ok: true
refs: {
refs/heads/master: {
error: ""
ok: true
}
}
}
Что мне кажется странным... Но коммит и его сообщение появляются на github.
Что я делаю неправильно? Я думаю, что сделал все необходимое, но может я что-то упустил...
Вот мой код:
const stagingRoot = '/staging'
...
import('https://unpkg.com/isomorphic-git@1.7.4/http/web/index.js').then(http => {
window.http = http
return true
}).then(response => {
// Initialize isomorphic-git with a file system
window.fs = new LightningFS('fs')
// Using the Promisified version
window.pfs = window.fs.promises
return true
}).then(response => {
const buttonSpace = document.getElementById('git_button_space')
const repositoryURL = appendText({value:'https://github.com/<my private repository path>.git'},document.getElementById('git_repository_url_space'))
let branch = appendDropdown(
{items:[{label:'master',value:'master'}],value:'master'},
document.getElementById('git_repository_branch_space'),
function(event) {}
)
const username = appendText({value:'<my user name>'},document.getElementById('user-js-git_username_space'))
const password = appendText({value:'<my app key>'},document.getElementById('user-js-git_password_space'))
const path = appendText({value:'/git/git_app2'},document.getElementById('user-js-git_repository_path_space'))
const pushButton = appendButton('プッシュ',buttonSpace, function(event) {
return pfs.du(stagingRoot)
.then(diskUsage => {
return pfs.rmdir(stagingRoot,{recursive: true})
})
.catch(error => {
return true
}).then(response => {
return pfs.mkdir(stagingRoot)
.catch(error => {
return true
})
}).then(response => {
return git.clone({
fs,
http,
dir:stagingRoot,
corsProxy: 'https://cors.isomorphic-git.org',
url: repositoryURL.getValue(),
ref: branch.getValue(),
onAuth: url => {
const auth = {
username: username.getValue(),
password: password.getValue(),
}
return auth
},
singleBranch: true,
depth: 100
})
}).then(response => {
return pfs.du(stagingRoot+path.getValue())
.then(diskUsage => {
return true
})
.catch(error => {
return pfs.mkdir(stagingRoot+path.getValue(),{recursive:true})
.catch(error => {
return true
})
})
}).then(response => {
return git.add({ fs, dir: stagingRoot+'/git', filepath: 'git_app2' })
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}))
}).then(response => {
return git.add({ fs, dir: stagingRoot+path.getValue(), filepath: 'package.json' })
}).then(response => {
const user = kintone.getLoginUser()
return swal.fire({
input: 'textarea',
inputPlaceholder: 'commit message',
inputAttributes: {
'aria-label': 'commit message'
},
showCancelButton: true
}).then(commitMessageResponse =>{
if(commitMessageResponse.isConfirmed) {
return git.commit({
fs,
dir: stagingRoot,
author: {
name: user.name,
email: user.email,
},
message: commitMessageResponse.value,
ref: branch.getValue(),
})
} else {
return false
}
})
}).then(response => {
return git.push({
fs,
http,
dir: stagingRoot,
corsProxy: 'https://cors.isomorphic-git.org',
remote: 'origin',
ref: branch.getValue(),
onAuth: url => {
const auth = {
username: username.getValue(),
password: password.getValue(),
}
return auth
},
})
}).then(response => {
console.log(response)
})
})
Я использую isomorphic-git и его библиотеку FS lightning-fs, которые включены в теги сценария:
<script src="https://unpkg.com/@isomorphic-git/lightning-fs"></script>
<script src="https://unpkg.com/isomorphic-git@1.7.4"></script>
Я также динамически импортирую http-библиотеку isomorphic-git, как показано ниже, поскольку моя среда (Kintone) не любит ES6:
import('https://unpkg.com/isomorphic-git@1.7.4/http/web/index.js').then(http => {
window.http = http
return true
})
1 ответ
Я решил проблемы, потому что их было 3:
- По - видимому, lightning-fs не реализует рекурсию для
rmdir
, поэтому я написал свое:
function recursive_rmdir(path) {
return pfs.readdir(path).then(fileList=> {
const allPromises = []
fileList.forEach(file => {
allPromises.push(pfs.lstat(path+'/'+file).then(fileInfo => {
if(fileInfo.isDirectory()) {
return recursive_rmdir(path+'/'+file)
} else {
return pfs.unlink(path+'/'+file)
}
}))
})
return Promise.all(allPromises).then(response => {
return pfs.rmdir(path)
})
})
}
- По - видимому, lightning-fs не реализует рекурсию для
mkdir
, поэтому я написал свое:
function recursive_mkdir(path) {
function mkdir(existing_path,recursive_path) {
const new_path = existing_path+recursive_path[0]+'/'
return pfs.du(new_path)
.then(diskUsage => {
return true
})
.catch(error => {
return pfs.mkdir(new_path)
.catch(error => {
console.log('error',error)
return false
})
}).then(response => {
if (recursive_path.length > 1) {
return mkdir(new_path,recursive_path.slice(1))
}
return true
})
}
return mkdir('',path.split('/'))
}
- Я неправильно понял, что считать аргументом в пользу
add()
Команда, которая в ретроспективе должна была быть очевидной, но именно поэтому размещение в документации только тривиальных примеров никогда не является хорошей идеей; приведите и не такой тривиальный пример, чтобы прояснить варианты использования! Итак, в чем была моя ошибка? Посмотрим на параметры:
git.add({
fs: <a file system implementation client>,
dir: '<The working tree directory path>',
filepath: '<The path to the file to add to the index>'
})
В примере кода, приведенном в документации API, было только имя файла дляfilepath
поскольку он расположен в корне каталога рабочего дерева. Когда я писал свой код, я невольно сделал то же самое:
...
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}))
}).then(response => {
return git.add({ fs, dir: stagingRoot+path.getValue(), filepath: 'package.json' })
}).then(response => {
...
Но рабочий каталог dir
должно быть только stagingRoot
! И значение пути должно быть вставлено вfilepath
как показано ниже:
...
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}}))
}).then(response => {
return git.add({ fs, dir: stagingRoot, filepath: path.getValue().slice(1)+'/'+'package.json' })
}).then(response => {
...
â € " .slice(1)
снять ведущую /
в качестве filepath
путь должен быть относительным!
Я наконец поймал свою ошибку, потому что .git
появился рядом с моим package.json
когда я использовал readdir()
чтобы перечислить содержимое каталога...
Надеюсь, это кому-то поможет, поэтому я также публикую отрывки из моего окончательного кода:
const pushButton = appendButton('プッシュ',buttonSpace, function(event) {
return pfs.du(stagingRoot)
.then(diskUsage => {
return recursive_rmdir(stagingRoot)
})
.catch(error => {
return true
}).then(response => {
return pfs.mkdir(stagingRoot)
.catch(error => {
console.log(error)
return true
})
}).then(response => {
return git.clone({
fs,
http,
dir:stagingRoot,
corsProxy: 'https://cors.isomorphic-git.org',
url: repositoryURL.getValue(),
ref: branch.getValue(),
onAuth: url => {
const auth = {
username: username.getValue(),
password: password.getValue(),
}
return auth
},
singleBranch: true,
depth: 100
})
}).then(response => {
return recursive_mkdir(stagingRoot+path.getValue())
.catch(error => {
console.log(error)
return true
})
}).then(response => {
return pfs.writeFile(stagingRoot+path.getValue()+'/package.json', JSON.stringify({key1:val1,key2:val2}))
}).then(response => {
return git.add({ fs, dir: stagingRoot, filepath: path.getValue().slice(1)+'/'+'package.json' })
}).then(response => {
const user = kintone.getLoginUser()
return swal.fire({
input: 'textarea',
inputPlaceholder: 'コミットのメッセージここに入力してください',
inputAttributes: {
'aria-label': 'コミットのメッセージここに入力してください'
},
showCancelButton: true
}).then(commitMessageResponse =>{
if(commitMessageResponse.isConfirmed) {
return git.commit({
fs,
dir: stagingRoot,
author: {
name: user.name,
email: user.email,
},
message: commitMessageResponse.value,
ref: branch.getValue(),
})
} else {
return false
}
})
}).then(response => {
return git.push({
fs,
http,
dir: stagingRoot,
corsProxy: 'https://cors.isomorphic-git.org',
remote: 'origin',
ref: branch.getValue(),
onAuth: url => {
const auth = {
username: username.getValue(),
password: password.getValue(),
}
return auth
},
})
})
})