Git: cómo enviar solo los files rastreados al control remoto

He visto muchas variantes de esta pregunta en SO, pero ninguna de ellas tenía lo que estaba buscando. Digamos que tengo un repository ~/MyRepo/ :

 $ ls -a ~/MyRepo code.r junk.txt .git 

En MyRepo solo se MyRepo el file code.r y no se realiza un seguimiento de code.r . Y digo que tengo un control remoto (por ejemplo, en Dropbox) en ~/Dropbox/MyShare/ que tiene acceso un amigo (solo para leer). La intención es que este control remoto solo contenga mi última versión code.r de code.r y no contenga junk.txt . Estoy intentando lograr lo siguiente: cada vez que code.r Deseo poder actualizar (automáticamente si es posible) el control remoto ~/Dropbox/MyShare/code.r con la versión confirmada de ~/MyRepo/code.r .

Soy consciente de .gitignore pero no estoy interesado en esa ruta porque tengo varios files sin seguimiento que quiero ignorar, y solo quiero "enviar" los files que estoy rastreando al control remoto. También probé el enfoque de hacer una cloning en ~/Dropbox/MyShare/ pero clonar o tirar siempre parece include files rastreados y no rastreados , contaminando así mi control remoto.

Mi solución actual es tener un gancho post-commit bajo ~/MyRepo/.git/hooks/ que tenga commands explícitos para copyr individualmente todos los "files que me importan" al control remoto. No me gusta esta solución porque los "files que me preocupan" pueden cambiar, y no tengo que ir y actualizar el enganche post-commit.

Espero que haya una manera de hacer que las últimas versiones confirmadas estén disponibles en ~/Dropbox/MyShare/ mediante una combinación de commands git. No me importa hacer un solo command manual "push" cada vez que me comprometo en ~/MyRepo/ .

Esto es lo que intenté basándome en una de las respuestas a continuación, pero todavía estoy perplejo.

 # create my repo mkdir foo cd foo git init touch fileA fileB fileC git add fileA git commit -m 'new' # now create remote mkdir ../foo_remote cd ../foo_remote git init cd ../foo git remote add foo_remote ../foo_remote bash-3.2$ git remote -v foo_remote ../foo_remote (fetch) foo_remote ../foo_remote (push) 

Ahora cuando bash presionar, aparece este post de error medio:

 bash-3.2$ git push foo_remote master Counting objects: 3, done. Writing objects: 100% (3/3), 207 bytes, done. Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. To ../foo_remote ! [remote rejected] master -> master (branch is currently checked out) error: failed to push some refs to '../foo_remote' 

¿Alguna idea de dónde me estoy equivocando?

Si no agrega el file, ¿por qué lo enviarán al control remoto? Respuesta simple: no agregue files a su repository local que no desea que sean enviados.

Ponga los files en el repository o no; el objective de un DVCS es tener los mismos files en todas partes.

Me gustaría volver a mirar .gitignore funciona – puedes savelo localmente y no includelo en el repository si no quieres compartirlo – este es el único propósito de este file y el hecho de que no quieras usarlo parece impar. Es como decir que quiero comstackr files C pero no quiero usar un comstackdor

 mkdir foo cd foo git init touch fileA fileB fileC fileD git add fileA git commit -m "New file" git push 

Solo fileA será empujado

Esto no responde directamente a su pregunta, pero también es un poco largo para un comentario y quería compartirlo de todos modos. Puede ayudar a algunos a pasar por el dolor que sentí.

Entonces mi consejo de la experiencia es:

No mezcle repositorys de Dropbox y github.

Me quemé un par de veces con esto y tuve conflictos por la generación de casi cada file.

Ahora siempre mantengo mis proyectos github (es decir, los Rails) en una carpeta diferente.

Creo ~/Dropnot como el nombre de esta carpeta diferente.
Como siempre, creo un alias en mi file .bash_aliases , en este caso alias not='cd ~/Dropnot'

Sin embargo, cuando estoy configurando una nueva máquina, a menudo uso una carpeta Dropbox / xfer para hacer rápidamente una configuration de 1 vez para transferir todos mis files Dropnot (los copio allí en otra máquina solo para eso).
En el futuro, uso fetch / pull / push para realizar cambios en los diversos repos de ese directory.