Nodegit: ¿Cómo modificar un file y presionar los cambios?

Busqué un ejemplo, pero no pude encontrar uno. La documentation no está explicada y no pude resolverlo.

¿Cómo modificar un file (README.md por ejemplo), crear una confirmación para el file modificado y luego enviar la confirmación al server?

Nodegit: http://www.nodegit.org/

Documentación de Nodegit: http://www.nodegit.org/nodegit

Hay un ejemplo de cómo crear / agregar y confirmar en su repository, lo que puede ayudarlo con la modificación del file.

https://github.com/nodegit/nodegit/blob/master/examples/add-and-commit.js

Con respecto al compromiso y al empuje, aquí está el fragment de cómo se ve mi código y espero que lo ayude un poco. Me tomó bastante time resolver esto y gracias a los chicos de Gitter , finalmente encontré una respuesta.

El código se ve así:

 var path = require('path'); var nodegit = require("nodegit"), repoFolder = path.resolve(__dirname, 'repos/test/.git'), fileToStage = 'README.md'; var repo, index, oid, remote; nodegit.Repository.open(repoFolder) .then(function(repoResult) { repo = repoResult; return repoResult.openIndex(); }) .then(function(indexResult) { index = indexResult; // this file is in the root of the directory and doesn't need a full path index.addByPath(fileToStage); // this will write files to the index index.write(); return index.writeTree(); }).then(function(oidResult) { oid = oidResult; return nodegit.Reference.nameToId(repo, "HEAD"); }).then(function(head) { return repo.getCommit(head); }).then(function(parent) { author = nodegit.Signature.now("Author Name", "author@email.com"); committer = nodegit.Signature.now("Commiter Name", "commiter@email.com); return repo.createCommit("HEAD", author, committer, "Added the Readme file for theme builder", oid, [parent]); }).then(function(commitId) { return console.log("New Commit: ", commitId); }) /// PUSH .then(function() { return repo.getRemote("origin"); }).then(function(remoteResult) { console.log('remote Loaded'); remote = remoteResult; remote.setCallbacks({ cnetworkingentials: function(url, userName) { return nodegit.Cnetworking.sshKeyFromAgent(userName); } }); console.log('remote Configunetworking'); return remote.connect(nodegit.Enums.DIRECTION.PUSH); }).then(function() { console.log('remote Connected?', remote.connected()) return remote.push( ["refs/heads/master:refs/heads/master"], null, repo.defaultSignature(), "Push to master") }).then(function() { console.log('remote Pushed!') }) .catch(function(reason) { console.log(reason); }) 

Espero que esto ayude.

La solución de Rafael funciona con security, aunque podría agregar que no es necesario realizar una .connect en el server. Aquí hay un enfoque mínimo para impulsar un repository:

  • Empujando a dominar utilizando solo authentication de nombre de usuario y contraseña:

      //Previous calls }).then(function() { return repo.getRemote("origin"); //Get origin remote }).then(function(remote) { return remote.push(["refs/heads/master:refs/heads/master"], { callbacks: { cnetworkingentials: function(url, userName) { console.log("Requesting cnetworkings"); return NodeGit.Cnetworking.userpassPlaintextNew("[USERNAME]", "[PASSWORD]"); } } }); }).then(function(err) { console.log("Push error number:"); console.log(err); }).catch(function(err) { console.log(err); }).done(function(commitId) { console.log("All done"); }) 
  • Presionando myBranch sobre authentication SSH:

      //Previous calls }).then(function() { return repo.getRemote("origin"); //Get origin remote }).then(function(remote) { return remote.push(["refs/heads/myBranch:refs/heads/myBranch"], { callbacks: { cnetworkingentials: function(url, userName) { console.log("Requesting cnetworkings"); return NodeGit.Cnetworking.sshKeyFromAgent(userName); } } }); }).then(function(err) { console.log("Push error number:"); console.log(err); }).catch(function(err) { console.log(err); }).done(function(commitId) { console.log("All done"); })