Cómo resolver el conflicto con la fusión con la API de Github

Estoy usando la API web de Github para controlar mi propio tenedor y un upstream. La tarea es extraer del repository de subida y fusionarlo en mi tenedor. Cuando hay un conflicto, quiero que la API fuerce-fusione los files y muestre el conflicto en el file de esta manera:

>>>>>> This line is from my fork ====== This line is from upstream <<<<<< 

Esto se puede hacer automáticamente con el cliente git cuando se ejecuta git pull o git merge , pero la API de Github ( https://developer.github.com/v3/repos/merging/ ) solo fallará si hay un conflicto y no se intenta hacer que el conflicto se vea como arriba. ¿Hay alguna forma de lograr lo anterior con la API de Github? ¡Gracias!

No, no es posible actualmente con la API de GitHub (ni a través de la interfaz de usuario de GitHub). Sin embargo, es una buena idea: se lo mencionaré al equipo, y si desea compartir más detalles sobre lo que está creando, comuníquese con support@github.com.

Puede acercarse bastante a la recreación de este comportamiento mediante el uso de una combinación de la API GitHub Commits y 2 progtwigs de línea de command: merge y diff .

Supongo que en su layout, los files en conflicto se guardan localmente en el disco o se presentan en el browser web. Si intentas hacer esto en un browser web, es posible que necesites poner el enfoque descrito a continuación detrás de tu propia API.

Con la API Commits, compara 2 commits . Hazlo en la dirección que quieras fusionar. La key 'files' en la respuesta de la llamada API le dará todos los files en conflicto, agregados y eliminados (creo).

La key base_commit, que se encuentra en la respuesta json, es la confirmación en la que está fusionando su sucursal. La key merge_base_commit es el ancestro común de su commit / branch y el objective (es decir, base_commit) commit / branch. Ambos están en el nivel superior.

Para cada file en la key de files, debe averiguar si hay una versión merge_base_commit del file. Si es así, realizará una combinación de 3 vías, al igual que git utilizando merge: merge -p file (commits [last]) file (merge_base_commit) file (base_commit) que le proporcionará el file labeldo de conflicto que busca.

Si no hay una versión merge_base_commit del file, usaría: file diff -DCONFLICT (commits [last]) file (base_commit). El parámetro -D le dará un file marcado, muy similar a lo que desea. Una expresión regular simple para replace las tags de fusión hará que se vea como las tags de conflicto de git.

Para get las 3 versiones de su file, comience con la tecla 'contents_url' de cada key de file. El contents_url as-is obtendrá su versión del file. Reemplace el parámetro de cadena de consulta ref con el sha de su base_commit y merge_base_commit: results ['merge_base_commit'] ['sha'] y results ['base_commit'] ['sha'].

Una vez que tenga los 3 files, puede hacer su fusión tripartita utilizando el progtwig de fusión. Si obtienes un 404 en merge_base_commit get, esto significa que necesitas hacer una fusión bidireccional. Si obtiene un 404 en el get base_commit, esto significa que su file no existe en la twig de destino, por lo que no hay nada que hacer desde la perspectiva de agregar tags de conflicto.